目录
一、事务的基本要素(ACID)
A:Atomicity,即原子性;
事务开始后的所有操作,要么全部完成,要么全部不完成,不会停留在中间环节;事务执行过程中出错,会回滚到事务开始前的状态,也就是说事务是一个不可分割的整体。
ps:flume的put和take事务也是通过错误回滚机制实现事务性的
C:Consistency,即一致性;
事务开始前和结束后,数据库的完整性约束并没有被破坏,例如A给B转账,A扣了钱,B不可能没收到。
I:Isolation,即隔离性;
同一时间,只允许一个事务请求同一数据,不同事务之间不会存在干扰;例如A用一张银行卡取钱,在取完钱之前,B不能往这张卡里转账。
D:Durability,即持久性;
事务完成后,事务对于数据库所做的更新将会持久化保存在数据库中,不能回滚。
二、事务的并发问题
1. 脏读:
事务A读取了事务B的数据,然后B进行数据回滚,A读到的是脏数据。
2. 不可重复读:
事务A多次重复读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新和提交,导致A每次读取到的同一数据的结果不一致。
解决途径:锁住每次重复读取的行,用行锁
3. 幻读:
事务A第一次查询数据,得到一个结果;然后事务B插入一条数据,事务A第二次查询数据时,多了一条数据,就好像发生了幻觉一样。
解决途径:锁住整张表,用表锁
区别点:
不可重复读侧重于修改,幻读侧重于增加和删除数据,解决途径分别是使用mysql的行锁和表锁
三、Mysql的事务隔离级别
1. 读未提交:脏读、不可重复读、幻读都可以发生
2. 不可重复读:不会发生脏读,但可能发生不可重复读和幻读
3. 可重复读:不会发生脏读和不可重复读,但是会发生幻读
4. 串行化:脏读、不可重复读、幻读都不会发生,事务隔离级别最高
ps:mysql默认的事务隔离级别是可重复读