事物处理@Transactional

事物处理@Transactional

@Transactional 属性

propagation 事务传播属性,默认为 Propagation.REQUIRED,
isolation 事务隔离级别,默认为 Isolation.DEFAULT
readOnly 只读事务,默认为 false,在 ORM 中被忽略,对 jdbc 操作起作用。
rollbackFor 事务遇到什么异常回滚,默认为 RuntimeException.class
timeout 方法执行超时时间,单位为秒,默认为-1,无执行时间限制,超时后报异常
最常用的方式:
@Transactional 所有的都采用默认值是最常用的方式
或者@Transactional(rollbackFor=Exception.class)

事物传播属性

默认的事务传播属性为 propagation=Propagation.REQUIRED
1.REQUIRED
支持当前事务,如果当前没有事务,就新建一个事务,这是最常见的方式。
2.SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
3.NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,调用结束后,原先的事务会恢复执行。
4.REQUIRESNEW
新建事务,如果当前存在事务,把当前事务挂起。
5.MANDATORY
支持当前事务,如果当前没有事务,就抛出异常。
6. NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
7.NESTED
与 REQUIRESNEW 的区别是, REQUIRESNEW 另起一个事务,将会与他的父事务相互独立,而 Nested 的事务和父事务是相依的,它的提交是要等和他的父事务一块提交的,如果父事务最后回滚,它也要回滚的。但是内部事务的回滚不会对外部事务造成影响。 Nested 事务的好处是有一个 savepoint。它只对DataSourceTransactionManager 事务管理器起作用。

事物隔离级别

默认的事务隔离级别属性为 isolation=Isolation.DEFAULT
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
SQLSERVER 和 Oracle 默认的事务隔离级别为 READ_COMMITTED
一定要慎重使用 ISOLATION_SERIALIZABLE 的事物隔离级别。这种配置会使用表级锁,对性能影响巨大。
一般没有特殊需要的话,配置为使用数据库缺省的事务隔离级别即可。
1.DEFAULT
默认的隔离级别,使用数据库默认的事务隔离级别
2.READ_UNCOMMITTED
事务最低的隔离级别,允许令外一个事务可以看到这个事务未提交的数据。
会产生脏读,不可重复读和幻像读。
3.READ_COMMITTED
保证一个事务修改的数据提交后才能被另外一个事务读取。锁定正在读取的行,大多数主流数据库的默认事务等级
4.REPEATABLE_READ
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。锁定所读取的所有行。可以防止脏读,不可重复读。但是可能出现幻像读。
5.SERIALIZABLE
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。锁表。
除了防止脏读,不可重复读外,还避免了幻像读。
7.脏读
由修改且未提交引起。
张三的工资为 5000,事务 A 中把他的工资改为 8000,但事务 A 尚未提交。与此同时,事务 B 正在读取张三的工资,读取到张三的工资为 8000。随后,事务 A 发生异常,而回滚了事务。张三的工资又回滚为 5000。最后,事务 B 读取到的张三工资为 8000 的数据即为脏数据,事务 B 做了一次脏读。大部分数据库缺省的事务隔离级别都不会出现这种状况。
8.不可重复读
由修改引起的。
在事务 A 中,读取到张三的工资为 5000,操作没有完成,事务还没提交。与此同时,事务 B 把张三的工资改为 8000,并提交了事务。随后,在事务 A 中,再次读取张三的工资,此时工资变为 8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。大部分数据库缺省的事物隔离级别都不会出现这种状况。
9.幻读
由添加引起的。
事务 A 读取所有工资为 5000 的人数为 10 人。此时,事务 B 插入一条工资也为 5000 的记录。这时,事务 A 再次读取工资为 5000 的员工,记录为 11 人。此时产生了幻读。大部分数据库缺省的事务隔离级别都会出现这种状况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,使用@Transactional注解来实现声明式事务管理是非常方便的。然而,有几个可能导致@Transactional注解无效的原因。 首先,根据引用\[1\],如果在捕获异常的同时抛出了异常,事务将不会回滚。这意味着在异常处理过程中,需要确保不再抛出异常,以便事务能够正常回滚。 其次,根据引用\[2\],如果@Transactional注解应用在非public修饰的方法上,事务将会失效。这意味着@Transactional注解应该应用在public修饰的方法上,以确保事务能够正确地被管理。 此外,根据引用\[3\],如果@Transactional注解应用在protected或private修饰的方法上,事务虽然无效,但不会报错。这是一个容易犯错的地方,需要注意。 综上所述,如果在Spring Boot中使用@Transactional注解无效,可以检查是否在异常处理过程中抛出了异常,以及是否将注解应用在public修饰的方法上。 #### 引用[.reference_title] - *1* [SpringBoot @Transactional 事务 注解 失效](https://blog.csdn.net/tianshi527/article/details/111236464)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot中使用@Transactional注解事物不生效的原因(数据库事务隔离机制以及传播机制传播行为)](https://blog.csdn.net/zy103118/article/details/122296318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [springboot 注解@Transactional失效的原因](https://blog.csdn.net/kang1011/article/details/121451324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值