`

PROPAGATION_REQUIRES_NEW事务管理中的变量

 
阅读更多
PROPAGATION_REQUIRES_NEW传播方式对于第二个事务,会产生一个全新的Connection来处理.两个连接的操作类似于:
[Java] view plain copy
  1. Connection con1 = ds.getConnection();  
  2. con1.setAutoCommit(false );  
  3. con1.executeUpdate(sql1);  
  4. con1.executeUpdate(sql2);  
  5. ...  
  6. Connection con2 = ds.getConnection();  
  7. con2.setAutoCommit(false );  
  8. con2.executeUpdate(sql1);  
  9. con2.exeucteUpdate(sql2);  
  10. ...  
  11. con2.commit();  
  12. con2.setAutoCommit(true );  
  13. con2.close();  
  14.   
  15. con1.executeUpdate(sqln);  
  16. ...  
  17. con1.commit();  
  18. con1.setAutoCommit(false );  
  19. con1.close();<pre></pre>  

Spring事务管理中事务涉及的变量主要有:

变量在两事务(第一个事务为PROPAGATION_REQUIRED,第二个事务为PROPAGATION_REQUIRES_NEW)创建、执行、完成过程中的变化如下:

 

第一个事务              
  TransStatus1     Transaction1     ConnectionHolder1  
  Transaction Transaction1   ConnectionHolder ConnectionHolder1   SynchronizedWithTransaction TRUE
  newTransaction TRUE       Connection con1
  newSynchronization TRUE   resource      
  suspendedResources null   key dataSource   Synchronizations  
  savepoint null   value ConnectionHolder1   ArrayList1 empty
                 
第二个事务:doGetTransaction
Transaction2  
ConnectionHolder ConnectionHolder1
                 
doSuspendTransaction        
  Transaction2     SuspendedResourcesHolder1  
  ConnectionHolder null   suspendedSynchronizations ArrayList1
      suspendedResources ConnectionHolder1
  resource      
  null     Synchronizations  
        null  
                 
doBegin
TransStatus2   Transaction2   ConnectionHolder2  
Transaction Transaction2 ConnectionHolder ConnectionHolder2 SynchronizedWithTransaction TRUE
newTransaction TRUE Connection con2
newSynchronization TRUE resource  
suspendedResources SuspendedResourcesHolder1 key dataSource Synchronizations  
  value ConnectionHolder2 ArrayList2 empty
savepoine null
                 
triggerBeforeCommit triggerBeforeCompletion doCommit:con2.commit triggerAfterCompletion  
doCleanupAfterCompletion
con2恢复autoCommit与isolationLevel resource   Synchronizations  
关闭连接 null   null  
                 
resume        
已经恢复到第一个事务doBegin刚完成状态   resource     Synchronizations  
  key dataSource   ArrayList1 empty
  value ConnectionHolder1    
                 

源码:

[Java] view plain copy
  1. public   void  addEmployee(Employee employee)  throws  SQLException {  
  2.   transactionTemplate.execute(new  TransactionCallback() {  
  3.     public  Object doInTransaction(TransactionStatus ts) {  
  4.       try  {  
  5.         jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)" ,   
  6.           new  Object[]{ "lizi" , new  Integer( 22 )});  
  7.         departmentDao.addDepartment();  
  8.         jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)" ,   
  9.           new  Object[]{ "lijun" , new  Integer( 55 )});  
  10.         System.out.println("更新成功" );  
  11.   
  12.       } catch  (Exception ex) {  
  13.         ex.printStackTrace();  
  14.         System.out.println("更新失败" );  
  15.         ts.setRollbackOnly();  
  16.       }  
  17.       //ts.setRollbackOnly();   
  18.       return   null ;  
  19.     }  
  20.   });  
  21. }  
[Java] view plain copy
  1. //DepartmentDao.java   
  2. public   void  setTransactionTemplate(  
  3.     TransactionTemplate deptTransactionTemplate) {  
  4.   this .transactionTemplate = deptTransactionTemplate;  
  5.   deptTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);  
  6.     
  7.   DataSourceTransactionManager manager = (DataSourceTransactionManager)deptTransactionTemplate.getTransactionManager();  
  8.   DataSource ds = manager.getDataSource();  
  9.     
  10.   jdbcTemplate = new  JdbcTemplate(ds);  
  11. }  
  12.   
  13. public   void  addDepartment() {  
  14.   transactionTemplate.execute(new  TransactionCallback() {  
  15.   
  16.     public  Object doInTransaction(TransactionStatus status) {  
  17.       try  {  
  18.         jdbcTemplate.update("insert into department (dept,deptName) values('IT','IT department')" );  
  19.       } catch  (Exception ex) {  
  20.         ex.printStackTrace();  
  21.         status.setRollbackOnly();  
  22.       }  
  23.       return   null ;  
  24.     }  
  25.       
  26.   });  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics