zoukankan      html  css  js  c++  java
  • TransactionDefinition接口中定义了七个事务传播行为

    1.PROPAGATION_REQUIRED如果存在一个事务,则支持当前事务,如果没有事务则开启一个新的事务。使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

    对于第一个方法,spring在调用methodA的时候没有事务,因此创建一个新的事务,而methodA中又调用了methodB,而此时已经存在一个事务了,所以methodB会加入到这个事务中;对于第二个方法,由于methodB此时没有事务,因此spring会开启一个新的事务。spring会确保方法中的所有调用都得到一个相同的连接。

    2.PROPAGATION_SUPPORTS如果存在一个事务,支持当前事务。如果没有事务,则非事务执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不适用事务有少许不同。

    3.PROPAGATION_MANDATORY如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。


    调用methodB的时候,因为当前没有一个活动的事务,则会抛出异常throw new IllegalTransactionStateExecption("Transaction propagation 'mandatory' but no existing transaction found");当调用methodA的时候,methodB会加入到methodA的事务中。

    4.PROPAGATION_REQUIRES_NEW总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

    这两段代码在一起。此时methodA会创建一个新的事务tr1,而methodA在执行到methodB()方法时,调用methodB方法,此时methodB方法又会创建一个新的事务tr2,这两个事务是没有关联相互独立的,如果methodA中在执行完methodB方法之后的doSomeThingB()方法执行失败了,那么methodA方法的数据会执行回滚不会提交,但是其中的methodB的数据仍然会提交到数据库中,这表明tr1和tr2之间是独立的。也就是说,只要methodB成功执行了,那么methodB的数据就会被加入到数据库,不管其后面的代码是否发生异常。如果使用PROPAGATION_REQUIRES_NEW,需要使用JtaTransactionManager作为事务管理器。

    5.PROPAGATION_NOT_SUPPORTED总是非事务地执行,并挂起任何存在的事务。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作为事务管理器。(代码示例同上,可同理推出)

    6.PROPAGATION_NEVER总是非事务地执行,如果存在一个活动事务,则抛出异常;

    7.PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。需要JDBC驱动的java.sql.Savepoint类。有一些JTA的事务管理器可能也提供了同样的功能。使用PROPAGATION_NESTED,需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true,而nestedTransactionAllowed属性值默认为false。

    这里如果单独调用methodB方法,则按照PROPAGATION_REQUIRED属性执行。如果调用methodA方法,那么在执行methodA方法内调用methodB方法的时候,会先调用setSavePoint方法,保存当前的状态到savepoint中,如果methodB方法调用失败,则恢复到之前记录的那个状态,然后继续执行后续代码,此时事务都还没有提交,如果其后面的doSomeThingB()方法调用失败,则回滚包括methodB在内的所有操作。也就是所:这是一个嵌套事务,嵌套事务的内层事务依赖于外层事务,如果外层事务失败时,会回滚内层事务,而内层事务操作失败的时候,并不会引起外层事务的回滚,外层事务会回复到内层事务执行之前的状态,然后继续执行后面的方法。

    注:
    PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW的区别:这两个事物的最大区别是PROPAGATION_NESTED是一个嵌套事务,内层事务依赖于外层事务,内层事务成功执行完成之后,数据其实并没有提交到数据库,而需要外层事务全部成功完成之后,内外层数据才会提交到数据库,若内层事务虽然成功执行,但是外层事务在其之后发生异常,则内层事务和外层事务全部回滚;而PROPAGATION_REQUIRES_NEW是完全两个不同的事务,相互之间是独立的,一旦内层事务提交了,外层事务发生异常也并不能让内层事务回滚。
    ---------------------
    作者:WSYW126
    原文:https://blog.csdn.net/WSYW126/article/details/72860290

  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/wzn520/p/11039397.html
Copyright © 2011-2022 走看看