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的时候就要进行一些协商,这就叫做事务的传播行为
.