事务
数据库事务是指对数据库执行一批操作。这些操作要么全部执行成功,要么全部执行失败。
在MySQL中,InnoDB引擎支持事务,而MyIsam引擎则不支持。
事务的ACID特性
A–原子性:事务中的所有操作,要么都做,要么都不做。
C–一致性:事务执行的结果必须是使数据库从一个一致性状态,变到另一个一致性状态。
I–隔离性:一个事务的执行不能被其他事务干扰。
D–持久性:一个事务一旦提交,它对数据库中数据的改变是永久性的。
mysql的4种事务隔离级别
1、读未提交
所有事务可以看到其他未提交事务的执行结果。容易出现脏读。
2、读已提交
事务只能看见已提交事务所做的改变。可能出现不可重复读。
3、可重复读
mysql的默认隔离级别。它避免了不可重复读的问题,但可能出现幻读。
4、串行化
最高的隔离级别,完全服从ACID特性的隔离级别。但是性能很差,可能导致大量超时。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可能 | 可能 | 可能 |
读已提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
什么是脏读
一个事务读取了另一个事务还没有提交的数据。
如:事务T1修改了某个数据,但未提交。这时,事务T2读取了事务T1修改后的数据。
然后,事务T1由于某种原因回滚了。那么,事务T2读取的数据就是脏的。
解决办法:提高隔离级别。
什么是不可重复读
指在同一事务内,两次相同的查询返回的是不同的结果。
如:事务T1会读取同一数据两次。在事务T1第1次读取该数据后,事务T2修改了该数据并提交。
此时,事务T1第2次读取该数据,两次读取便得到了不同的结果。
解决办法:提高隔离级别。
什么是幻读
当事务不独立执行时,不同事务对同一部分数据进行插入和删除而发生的一种类似幻觉的现象。
如:事务A将表中的所有数据都删除后。此时事务B插入了一条新记录并提交。
事务A在删除结束后发现表中还有一条数据,就好像出现幻觉一样。
解决办法:仍然是提高隔离级别。