spring事务传播属性

 在 spring的 TransactionDefinition接口中一共定义了六种事务传播属性:

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。 
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 
前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。 
它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager) 

举例浅析Spring嵌套事务

ServiceA#methodA(我们称之为外部事务),ServiceB#methodB(我们称之为外部事务)

ServiceA {  
         
     void methodA() {  
         ServiceB.methodB();  
     }  
    
}  
    
ServiceB {  
         
     void methodB() {  
     }  
         
}  

以下是个人理解:

显式事务

每个事务均以 start transaction语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。如果不COMMIT,当链接断开时,会ROLLBACK。但是如果链接没有断开,而被另外一个线程拿到,并且也执行了了start transaction,那之前的也会提交。

隐式事务

在前一个事务完成时新事务隐式启动,语句完成之后,自动提交,应该也是在autocommit=1的情况下才可以。如果你的业务只有一条sql语句,可以使用隐式事务。也可以叫非事务方式(严格来说叫非显示事务方式)。

单条sql语句有必要显示事务么

没必要。换句话说如果sql操作不依赖于任何外部条件,就没有必要使用(显式)事务。事务是指当多个条件同时达成时,才提交,任何一个失败,则回滚。

当前事务挂起是什么意思:

The point of suspending a transaction is to change the current transaction for a thread to a new one. This would NOT line up with the semantics of nested transactions because the new and suspended transactions are completely independent of each other. There is no connection-level API to support suspending transactions so this has to be done by using a different connection. If you are using JTA with Spring, this is done by the JTA transaction manager. If you are using DataSourceTransactionManager, you can look in the code and see that it will be saving off the current connection as a "suspended resource" and grabbing a new connection from the data source for the new transaction.

数据库的sql语句没有挂起事务的命令。上边的解释是挂起事务就是使用一个新的链接来操作。这样外层事务和内层事务使用的是不同的链接。

非事务方式执行是什么意思

对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况:

1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行commit命令时提交,用户本次对数据库开始进行操作到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。总而言之,当前情况下事务的状态是自动开启手动提交。

2>若参数autocommit=1(系统默认值),事务的开启与提交又分为两种状态:

①手动开启手动提交:当用户执行start transaction命令时(事务初始化),一个事务开启,当用户执行commit命令时当前事务提交。从用户执行start transaction命令到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。

②自动开启自动提交:如果用户在当前情况下(参数autocommit=1)未执行start transaction命令而对数据库进行了操作,系统则默认用户对数据库的每一个操作为一个孤立的事务,也就是说用户每进行一次操作系都会即时提交或者即时回滚。这种情况下用户的每一个操作都是一个完整的事务周期。

所谓的非事物方式运行,就是在autocommit=1的情况下,没有手工执行start transaction,这样每执行一条命令,都会自动提交。就是上边的2 - ②自动开启自动提交说的情况。也可以叫隐式事务。

新建一个事务是什么意思

个人理解就是在当前链接上执行了一次start transaction命令,显示的开始一个事务。如果是挂起外层事务,再新建一个事务,那就是在一个新的链接上显示的新建一个事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值