-
什么是事务:
多个数据库操作构成的一个逻辑单位
-
事务的四大特性ACID:
1.原子性Atomic:事务中的操作,任一失败操作都会导致整个事务的失败
2.一致性Consistent:事务结束后,系统状态是一致的。
例子:10个人,每人一个账户,里面有钱,互相转来转去,这组成一个数据系统。10人的账号总金额不变,就满足一致 性,数据库中如果存在没有执行完的事务,就不一致。
3.隔离性Isolated:并发执行的事务,互不干扰,如果事务没有commit,修改的数据,其他事务无法看到
4.持久性Durability:事务提交后,不管发生什么,改动都不会丢失。
-
如果不隔离,可能出现的问题
1.脏读:
例子:事务A:乙往甲账户转100元,但没提交
事务B:甲查看余额,为100,这时候就出现了脏读。
即一个事务在处理过程中读取了另一个事务未提交的数据。
2.不可重复读:
例子:事务B:甲查看余额,为0元 -->事务A:乙往甲账户转100元,且提交
-->事务B:再次查看,为100元,即这时就出现了不可重复读
即一个事务读取了另一个事务提交的数据,有时,不可重复读不是问题。针对同一数据项
3.幻读:
例子:事务B:甲老师查询学生人数 -->事务A:乙老师添加了一个学生
-->事务B:甲老师查询学生人数发现多了一个,出现了幻读
也是一个事务读取了另一个事务提交的数据。针对一批数据整体
-
隔离级别:
为了解决上面的问题,可为数据库设置隔离级别,级别从低到高,越高效率越低
1.读未提交:
事务未提交,他的变更可以被其他事务所见。 --很少被使用
2.读已提交:
事务提交后,才能被其他事务所见。 解决脏读。
oracle的默认级别
3.可重复读:
多次读取同一范围数据,仍然返回第一次读的数据的快照。解决了不可重复读。
mysql的默认级别
4.串行化:
“写”会加“写锁”,“读”会加“读锁”,当读写锁冲突时,后面的事务必须等前一事务处理完才继续执行。 --很少被使用