`

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.   });  
分享到:
评论

相关推荐

    2018java基础面试题.doc

    - `PROPAGATION_REQUIRES_NEW`:总是新建事务,如果已有事务则挂起。 - `PROPAGATION_SUPPORTS`:如果有事务则参与,无事务则非事务执行。 - `PROPAGATION_NOT_SUPPORTED`:非事务执行,如果已有事务则挂起。 - ...

    java学习整理文档.docx

    5. **事务传播行为**:Spring定义了七种事务传播行为,比如PROPAGATION_REQUIRED(默认,若无事务则新建)、PROPAGATION_SUPPORTS(若有事务则加入,否则非事务运行)、PROPAGATION_REQUIRES_NEW(总是新建事务,若...

    关于牛客刷题总结全部汇总

    关于牛客刷题总结全部汇总 ...2. 传播行为意义:PROPAGATION_MANDATORY、PROPAGATION_NESTED、PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED、PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW 等。

    注入JdbcTemplate启用事务管理.docx

    4. `Propagation.REQUIRES_NEW`:总是开启一个新的事务,即使当前存在事务,也会挂起当前事务。 5. `Propagation.NOT_SUPPORTED`:不支持事务,如果存在当前事务,就挂起它。 6. `Propagation.NEVER`:不允许在...

    Spring事务介绍,分23类进行梳理

    在Spring框架中,事务是通过事务管理器来管理的,事务管理器负责事务的提交和回滚。事务可以分为不同的类别,例如平台事务管理器、事务al注解、声明式事务管理、编程式事务管理等。Spring事务的同步机制使用...

    收集的struts+spring+hibernate面试题.doc

    - `PROPAGATION_REQUIRES_NEW`:总是新建事务。 - `PROPAGATION_NOT_SUPPORTED`:如果有事务则挂起,以非事务方式运行。 - `PROPAGATION_NEVER`:总是以非事务方式运行,如果当前存在事务则抛出异常。 - `...

    宜信java程序员面试题.pdf,这是一份不错的文件

    19. 事务传播行为:`PROPAGATION_REQUIRED`、`PROPAGATION_SUPPORTS`、`PROPAGATION_NEVER`、`PROPAGATION_NOT_SUPPORTED`和`PROPAGATION_REQUIRES_NEW`是Spring事务管理的传播行为选项。 20. 事务隔离级别:`...

    杭州端点公司java面试题.md

    - **PROPAGATION_REQUIRES_NEW**:总是创建一个新的事务,如果已经存在一个事务,则将它挂起。 - **PROPAGATION_NOT_SUPPORTED**:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。 - **PROPAGATION_NEVER...

    DAO多线程的技巧.rar_dao

    可以使用Spring的@Transactional注解配合PROPAGATION_REQUIRES_NEW属性,为每个线程创建独立的事务。 4. **读写分离与分布式事务** - **读写分离**:在高并发场景下,可以将读操作和写操作分配到不同的数据库...

    软件开发人员招聘笔试试题.doc

    17. REQUIRES_NEW事务属性表示创建新的事务,即使在当前事务中,确保新事务独立。 18. 事务失败时,会话Bean的重新初始化通常由容器自动处理,例如回滚事务、恢复到之前状态。 19. 开发JDBC应用,WebLogic Server...

    Spring MySQL多数据源

    @Transactional(propagation = Propagation.REQUIRES_NEW, value = "transactionManager1") public void serviceMethod1() { // 使用dataSource1执行操作... } @Transactional(propagation = Propagation....

    高级开发spring面试题和答案.pdf

    - 事务传播特性包括7种:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。 10. **多数据源事务** - 在多数据源情况下,可以使用`@Transactional`注解的`propagation`属性配合不同的...

    SpringBoot-MyBatis-DataSource(多数据源以及动态切换)

    在Spring Boot应用中,集成MyBatis作为...在实际项目中,还需要考虑事务管理、异常处理等问题,确保在切换数据源时,事务的一致性和正确性。同时,注意在不同数据源之间进行数据同步或数据隔离,以满足系统的业务需求。

    最热门的Java 面试题汇总

    41. **Spring事务传播行为和隔离级别**:如PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW等,隔离级别有READ_UNCOMMITTED等。 42. **IOC与DI**:控制反转(IOC)将对象的创建和依赖关系交给容器管理,依赖注入...

Global site tag (gtag.js) - Google Analytics