事务@Transactional

目录

一、简介

二、spring事务到底用于service层还是dao层

三、嵌套事务


一、简介

可以采用MyBatis控制事务
事务应该在业务逻辑层控制
硬编码方式,代码繁琐,且破坏分层,代码不易维护

可以采用AOP的方式实现
Spring提供了声明式事务支持

propagation:事务传播机制
REQUIRED(默认值)
REQUIRES_NEW 、MANDATORY、NESTED
SUPPORTS
NOT_SUPPORTED、NEVER

1.propagation:事务传播机制。
(1.)REQUIRED:默认值,表示如果存在一个事务,则支持当前事务;如果当前没有事务,则开启一个新的事务。
(2.)REQUIRES_NEW:表示总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起,开启新事务执行该方法。
(3.)MANDATORY:表示如果存在一个事务,则支持当前事务;如果当前没有一个活动的事务,则抛出异常。
(4.)NESTED:表示如果当前存在一个活动的事务,则创建一个事务作为当前事务的嵌套事务运行;如果没有当前事务,该取值与REQUIRED相同。
(5.)SUPPORTS:表示如果存在一个事务,则支持当前事务;如果当前没有事务,则按非事务方式执行。
(6.)NOT_SUPPORTED:表示总是以非事务方式执行。如果一个事务已经存在,则将这个存在的事务挂起,然后执行该方法。
(7.)NEVER:表示总是以非事务方式执行。如果当前存在一个活动的事务,则抛出异常。
2.isolation:事务隔离等级
(1.)DEFAULT:默认值,表示使用数据库默认的事务隔离级别。
(2.)READ_UNCOMMITTED:未提交读。
(3.)READ_COMMITTED:提交读。
(4.)REPEATABLE_READ:可重复读。
(5.)SERIALIZABLE:串行读。

3.timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时
4.read-only:事务是否为只读,默认值为false
5.rollback-for:设定能够触发回滚的异常类型
Spring默认只在抛出runtime exception时才标识事务回滚
可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开
6.no-rollback-for:设定不触发回滚的异常类型
Spring默认checked Exception不会触发事务回滚
可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开

 

二、spring事务到底用于service层还是dao层

Spring事务为业务逻辑进行事务管理,保证业务逻辑上数据的原子性。

事务得根据项目性质来细分:事务可以设置到三个层面(dao层、service层和web层)。 

第一:web层事务,这一般是针对那些安全性要求较高的系统来说的。例如电子商务网站。粒度小,一般系统用不着这么细。 

第二:service层事务,这是一常见的事务划分, 将事务设置在业务逻辑上,只要业务逻辑出错或异常就事务回滚。粒度较小,一般推荐这种方式。

第三:数据持久层数据务,也就是常说的数据库事务。这种事务在安全性方面要求低。就是给一个简单的增删改之类的操作增加事务操作。粒度大

给Service层配置事务,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。

事务分为业务事务和系统事务,业务事务也就是业务逻辑上操作的一致性,系统事务自然就是指真正的数据库事务,

Spring配置事务的是为了什么进行管理,当然是为业务逻辑进行事务管理,保证业务逻辑上数据的原子性;

Dao层是什么,数据访问层,是不应该包含业务逻辑的,这就是和Service层的不同;

Service层就是业务逻辑层,事务的管理就是为Service层上的保证。

三、嵌套事务

Spring事务管理是通过JDK动态代理的方式进行实现的,只有代理对象proxy直接调用的那个方法才是真正的走代理的;所以嵌套使用@Transactional,内部的@Transactional是无效的。

 

参考:

https://blog.youkuaiyun.com/haoxin1805487180/article/details/83119508

https://www.cnblogs.com/hutton/p/5493095.html

https://blog.youkuaiyun.com/qq_33101675/article/details/83012379

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值