Spring事务的四种特性 事务的三种并发访问问题真实场景解读 事务的四种隔离级别 事务七种的传播行为

1.事务的基本特性(ACID)

  • 原子性:一个事务是一个整体,不可分割,事务中的操作要么全部成功要么全部失败
  • 一致性:一致性和原子性描述的是同一件事情,原子性是从操作的角度来说,要么全部成功要么全部失败,一致性是从数据的角度来说,数据要么是事务提交前的状态,要么是事务全部完成的状态.比如转账,初始状态(1000,1000) 转账100.事务提交之后数据要么是(1100,900)要么是(1000,1000),不能出现(1000,900)的情况
  • 隔离性:在事务并发访问中,事务之间互不影响
  • 持久性:事务一旦提交即生效,数据不会改变

 

2.事务并发访问问题

  • 脏读:一个事务读到了另一个事务未提交的数据

(场景:A给B转钱,转钱之前B有1000块钱,A这面开启事务转了100,还没有提交,在B的事务里就看到了自己的钱多了100块钱,如果挂了电话A回滚了,B就懵逼了)

  • 不可重复读:一个事务读到了另一个事务已提交的update数据

(场景:A到银行存钱,存钱之前查了一下卡还有10000块钱,银行给A存了10000块钱,存完之后,A的老婆B在家里在网上用这张卡消费了20000块钱,并且提交了,这时在银行的这个事务里再次查询卡里还有多少钱,这时还有0元,来银行的时候卡里有10000块钱,存完10000之后卡里还有0元了,A当场就躺地上了,这就是读到了另一个事务已经提交的update语句)

(简单记法:对于单条数据来说,读了一次,在重复读了一次就和上一次读的数据不一致了,一重复读就见鬼了,所以叫不可重复读)

  • 虚幻读:一个事务读到了另一个事务已提交的insert/delete语句

(简单记法:虚幻,想到近视眼看一个东西好像有两三个重影,就对应着数据库中insert/delete语句导致数据的条数不一样了,所以叫虚幻读)

 

3.事务的隔离级别:(解决事务的并发问题的)

  • 读未提交:Read Uncommited 读到了未提交的数据,对应着最低级别的脏读还在发生,什么问题都解决不了
  • 读已提交:Read Committed 读到了已经提交的数据,对应着不可重复读还在发生,但是脏读解决了(oracle数据库的默认级别)
  • 可重复读:Read Repeatable,可重复读对应着解决了不可重复读的问题,Mysql数据库的默认级别
  • 串行化:Serializable 解决了所有问题,单线程,极端化,不能使用

 

4.事务的传播行为:

事务往往在service层进行控制,如果service层的方法A调用了另一个Service层的方法B,A和B本身都已经被添加了事务了,那么在A调用B的时候就要进行一些协商,这就叫做事务的传播行为

Spring事务的四种特性 事务的三种并发访问问题真实场景解读 事务的四种隔离级别 事务七种的传播行为_第1张图片

.

 

你可能感兴趣的:(技术点总结)