@Transaction 注解学习

spring中,事务管理机制主要有编程式事务和声明式事务2种。
1、编程式事务
在代码中手工管理事务的提交和回滚,代码侵入性强,耦合度高。
2、声明式事务
基于AOP面向切面的(通过动态代理实现),将具体业务和事务处理部分解耦,代码侵入性低。
有两种实现方式:
1、基于TX和AOP的xml配置文件方式
2、基于注解@Transactional方式实现
3、@Transactional 可以作用在接口、类、方法上
1、作用在类上,表示该类的所有public方法都配置相同的事务属性
2、作用在方法上,当类也配置了@Transactional属性,方法的@Transactional属性会覆盖类的@Transactional事务属性。
3、作用在接口上,不推荐这种方式,因为如果作用在接口上并且配置了spring aop的动态代理实现方式为cglib,将会导致@Transactional失效。
4、@Transactional 的常用事务属性
事务属性有五个方面:传播行为,隔离级别,事务超时时间,回滚规则,是否只读。
public interface TransactionDefinition {
int getPropagationBehavior(); // 传播行为。
int getIsolationLevel(); // 隔离级别。事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。
int getTimeout(); // 事务必须在多少秒内完成。
boolean isReadOnly(); // 事务是否只读。事务管理器能够根据这个返回值进行优化,确保事务是只读的
}
propagation 事务传播行为属性
Propagation.REQUIRED 存在事务则加入,否则新建一个事务
Propagation.SUPPORTS 存在事务则加入,否则以非事务方式运行
Propagation.MANDATORY 存在事务则加入,否则抛出异常
Propagation.REQUIRES_NEW 新建一个事务,如果当前存在事务则挂起当前事务
Propagation.NOT_SUPPORTED 以非事务方式运行,如果当前存在事务则挂起事务
Propagation.NEVER 以非事务方式运行,如果当前存在事务则抛出异常
Propagation.NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则与PROPAGATION_REQUIRED类似。
isolation 事务隔离级别属性
Isolation.DEFAULT 使用底层数据库默认的隔离级别
Isolation.READ_UNCOMMITTED 未提交读取
Isolation.READ_COMMITTED 已提交读取
Isolation.REPEATABLE_READ 可重复读
Isolation.SERIALIZABLE 系列化
数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况。
更新丢失(Lost update)
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了,造成更新丢失。
脏读(Dirty reads)
一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。
不可重复读(Non-repeatable Reads)
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
比如事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。又叫虚读。
幻读(Phantom Reads)
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据
(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
不可重复读的重点是修改某个记录字段,幻读的重点在于新增或者删除记录。
对于前者, 只需要锁住满足条件的记录。对于后者, 要锁住满足条件及其相近的记录。
“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

timeOut事务超时属性
事务的超时时间,默认值为 -1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
readOnly是否只读属性
指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollbackFor 属性
用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。
noRollbackFor属性
抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。

5、@Transactional 常见失效场景如下:
1、@Transactional注解的方法被同一个类里的其他方法调用;
2、@Transactional注解的方法属于非public方法
3、@Transactional注解的方法抛出的异常被吃了,没有继续往外抛。
4、事务传播属性配置错误,如配置了:Propagation.SUPPORTS、Propagation.NOT_SUPPORTED、Propagation.NEVER
5、rollbackFor属性配置错误
6、数据库引擎不支持事务,比如MySQL的Myisam

6、源码分析如下:
待更新…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值