事务的概念
事务是什么,其实就是指逻辑上的一组操作,可以理解为原子性,就是这些操作要么都成功,要么都失败,来达到数据的准确性。
声明式事务
声明式事务与编程式事务两种开发方式:
- 编程式事务是业务代码与事务控制相耦合
- 声明式事务是使用xml配置的方式或者注解的方式来实现事务的控制
事务的特性
原子性(Atomicity)
从操作的角度来描述:操作不可分割,事务中的操作要么都发生,要么都不发生
一致性(Consistency)
从数据的角度来描述:数据从一个一致性状态转化成另一个一致性状态,拿转账来说,转账前总和是200,转账后的总和也是200,这个200就是保证一致状态的一个限制
持久性(Isolation)
事务一旦提交,对数据的操作改变是永久的,不受外界环境的变化而受到影响
隔离性(Durability)
事务并发,也就是事务之间应该互不干扰,相互隔离
事务的隔离级别
隔离级别的目的是为了解决事务的并发问题,那事务的并发带来了哪些问题呢?
- 脏读:一个事务读到了另一个事务尚未提交的数据
- 不可重复读:一个事务相同内容两次读到的结果不同,另一个事务进行了update操作并提交事务
- 幻读:还是相同的操作两次读到的结果不同,不过是另一个事务进行了delete或者insert操作并提交事务
事务的隔离级别的分类:
- Serializable(串行化):可避免脏读、不可重复读和幻读
- Repeatable read(可重复读):避免脏读、不可重复读;该机制下会对update的行进行加锁
- Read Commited(读已提交):避免脏读;
- Read Uncommited(读未提交):不能避免任何问题
从上到下,安全级别是依次降低的,在MySQL中的默认级别是REPEATABLE READ。
事务的传播行为
什么是事务的传播行为呢?就是说事务之间的相互调用,比如说我Service A调用Service B,A和B都添加了这个,这个时候的事务如何控制呢?
事务的传播行为是站在被调用方来说的,也就是B的角度来说的:
PROPAGATION_REQUIRED | 如果当前没有事务,就新建⼀个事务,如果已经存在⼀个事务中,加⼊到这个事务中。这是最常⻅的选择。 |
---|---|
PROPAGATION_SUPPORTS | ⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。 |
PROPAGATION_MANDATORY | 使⽤当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则执⾏与PROPAGATION_REQUIRED类似的操作。 |