事务对于我们来讲不并陌生,也是在实际应用中一直都在使用。在JDBC中,事务大致的使用结构如下:
开启事务 业务逻辑处理 提交事务 Spring只是对事务进行了扩展和封装使用,现在看看在内部它是如何工作的。 1. PlatformTransactionManager PlatformTransactionManager是一个接口,它定义的方法如下:// 获取事务 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 提交事务 void commit(TransactionStatus status) throws TransactionException; // 回滚事务 void rollback(TransactionStatus status) throws TransactionException;
看到这个类的定义,基本上对事务的功能有一个初步的掌握,完全就是平时写事务步骤的关键方法啊!
2. AbstractPlatformTransactionManager AbstractPlatformTransactionManager它实现了PlatformTransactionManager接口。但是这个抽象类只是定义了一个骨架,抽象出 doBegin(),doCommit(),doRollback()这三个抽象方法让子类去实现。 3. DataSourceTransactionManager DataSourceTransactionManager是JDBC事务的实现类,它继承了AbstractPlatformTransactionManager类,并实现了doBegin(),doCommit(),doRollback()这三个关键的方法。 DataSourceTransactionManager有一个成员是DataSource,在事务配置时,要传这个属性过去。 doBegin() 中有一个关键的代码:con.setAutoCommit(false); doCommit() 中有一个关键的代码:con.commit(); doRollback() 中有一个关键的代码:con.rollback(); 看到这里,有没有很熟悉的感觉呢?! 4. TransactionTemplate TransactionTemplate是手动事务编程的模板类,它是如何来完成的呢?它有一个重要的方法:execute()方法,它里面定义了事务操作的基本骨架,剔除一些异常处理的代码,看看最关键的代码并作注释。public T execute(TransactionCallback action) throws TransactionException { // 这里主要调用了doBegin()方法 TransactionStatus status = this.transactionManager.getTransaction(this); T result; try { // 回调子类中的具体实现逻辑,处理业务逻辑 result = action.doInTransaction(status); }catch(Exception e){ // 调用doRollback()方法 rollbackOnException(status, ex); } // 调用doCommit()方法 this.transactionManager.commit(status); return result; }
看完了应该明白了模板方法在它里面的应用了吧。