事务的概念

事务是什么,其实就是指逻辑上的一组操作,可以理解为原子性,就是这些操作要么都成功,要么都失败,来达到数据的准确性。

声明式事务

声明式事务与编程式事务两种开发方式:

  • 编程式事务是业务代码与事务控制相耦合
  • 声明式事务是使用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类似的操作。