参考
https://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
https://segmentfault.com/a/1190000013341344
https://baijiahao.baidu.com/s?id=1611918898724887602
事务ACID
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability
开启事务 (MySql只有 InnoDB引擎 支持事务)
在接口或类的声明处 ,写一个@Transactional
要是只在接口上写, 接口的实现类就会继承下来。但是在接口的实现类的注解,可以覆盖类声明处的注解设置
@Transactional //类级的注解、适用于类中所有的public的方法
什么是事务传播行为
事务传播行为是指 作为事务的方法 被嵌套进 另一个方法(外围方法) 时的处理方法
spring事务传播行为注解
@Transactional(propagation=Propagation.REQUIRED)
如果 外围方法 是个事务, 那么 内部方法的事务 会加入 外围方法的事务, 没有的话新建一个事务(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个(外围)方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管 外围方法 是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事务超时设置:
@Transactional(timeout=30) //默认是30秒
事务的隔离性
事务的隔离性指 多个并发的事务 同时 访问一个数据库时,一个事务 不应该被 另一个事务 所干扰,每个 并发的事务 间要相互进行隔离。
-
脏读(dirty read)(读取未提交数据)
A事务 读取 B事务 尚未提交的数据 ,此时 如果 B事务发生错误并执行回滚操作,那么 A事务 读取到的数据就是 脏数据 -
不可重复读 (unrepeatable read)
事务T1读取某一数据,事务T2 修改 了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 -
幻读(phantom problem)
事务T1读取某一数据,事务T2 增删 了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
数据库四种隔离级别
-
读未提交(Read Uncommitted)
顾名思义,就是可以读到未提交的内容。
可能会产生“脏读”、“不可重复读”、“幻读”。
如无特殊情况,基本是不会使用这种隔离级别的。 -
读提交(Read Committed)
顾名思义,就是只能读到已经提交了的内容。
这是各种系统中最常用的一种隔离级别,也是SQL Server和Oracle的默认隔离级别。 -
可重复读(Repeated Read)
可以有效的避免“不可重复读”。而它也是MySql的默认隔离级别。 -
串行化(Serializable)