20191125 事务以及隔离级别二

本文深入解析Spring事务管理机制,包括配置式事务、传播行为、事务嵌套及隔离级别的处理,探讨了Spring如何封装数据库事务,以及如何在服务层实现细粒度的事务控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring的配置式事务可以把多个操作数据库的方法配置在一个事务中。

 

起了一个新事务,就是创建了一个新的数据库连接。

如果方法中全是查询操作 根本没必要使用事务。

只是多了传播行为,只是因为存在方法的调用。根据你的传播行为,是使用同一个会话,还是使用一个新的连接回话。

 

Spring的事务是什么?与数据库的事务是否一样?

本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,Spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭

Spring事务对数据库事务的包装,原理就是拿一个数据连接,根据Spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.

Spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.

 

MySql中的事务嵌套

1、Mysql中的事务必须是InnoDB、Berkeley DB引擎,myisam不支持。

2、Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务

3、Mysql默认是autocommit=1,也就是说默认是立即提交,如果想开启事务,先设置autocommit=0,然后用START TRANSACTION、 COMMIT、 ROLLBACK来使用具体的事务。

4、事务控制要成对出现,有开启,必有提交和回滚,如果不匹配导致事务计时器错误,偏离预期的控制效果;

5、事务一般配合try catch异常处理语句一起实现,try包裹的语句体内,如果有错误,应该主动抛出异常,在catch内进行回滚操作,而不能直接在异常处回滚;

 

事务与事务的传播行为。

1、@Transactional 所在的类必须交给Spring管理,否则注解无效

2、单独一个事务方法:方法内的操作同时成功,同时失败。

3、多个事务方法之间,存在事务的传播行为。

 

在service层加入事务控制。

由于@Transactional在Spring中的默认的事务规则是遇到运行异常(RuntimeException)才会进行回滚。如果想针对特殊异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。比如:

@Transactional(rollbackFor= Exception.class)

 

PROPAGATION_SUPPORTS:

支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务。

如果当前没有逻辑事务,就以非事务方式执行

 

NotSupported:

不支持事务,如果当前存在事务则暂停该事务。使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行。

一句话以非事务的方式,如果有事务,就把事务关闭。

比如excel导入数据,可以以非事务的方式运行。

 

Spring的声明式事务是基于代理模式的。代理模式简单来说就是将另一个类包裹在目标类外面,在调用目标类的方法之前,先经过目标类的方法进行一些处理,返回之前再进行一些处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值