一、事务的四个特性
事务的隔离级别是ACID,也就是原子性、一致性、隔离性、持久性。
1、原子性
原子性意味着整个事务的操作要么全部提交成功,要么全部失败回滚。
2、一致性
一致性的意思是数据库总是从一个一致性的状态转化到另一个一致性的状态,事务没有提交的话,所做的修改就不会保存到数据库中。
3、隔离性
一个事务所做的修改在最终提交以前,对其他事务是不可见的。
4、持久性
一旦事务提交,所做的修改会永久的保存到数据库中。
实现了ACID的数据库,通常会需要更强的cpu处理能力和更大的内存和更多的磁盘空间。
二、如果没有隔离,会出现什么问题?
1、脏读
事务A | 事务B |
---|---|
开启事务A | |
开启事务B | |
查询余额为100 | |
增加余额至150 | |
查询余额为150 |
为什么说是脏读呢,因为没有提交,如果回滚的话,那么此时读取到的数据也只是镜花水月。
2、不可重复读
事务A | 事务B |
---|---|
开启事务A | |
开启事务B | |
查询余额为100 | |
增加余额至150 | |
查询余额为100 | |
提交事务 | |
查询余额为150 |
是指一个事务范围内,多次查询某个数据,却得到不同的结果。
在第一个事务中的两次读取数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能就是不一样的。
3、幻读
事务A | 事务B |
---|---|
开启事务A | |
开启事务B | |
查询id<3的记录有3条 | |
增加一条id=2的记录 | |
提交事务 | |
查询id<3 的记录有四条 |
再比如事务 T1 对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务 T2 又对这个表中插入了一行数据项为“1”的数据,并且提交给数据库。而操作事务 T1 的用户如果再查看刚刚修改的数据,会发现数据还是 1,其实这行是从事务 T2 中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读的都是读取到的已经提交的数据,但是幻读针对的是一批数据,而不可重复读针对的是一行数据。
三、事务的隔离级别
1、未提交读
事务中的修改,即使没有提交,对其他事务也是可见的,事务可以读取到未提交的数据,未提交读不能避免上述任何一个问题。
2、读已提交
一个事务开始时,只能看到已经提交的事务所做的修改。可以避免脏读。
3、可重复读
同一个事务中,多次读取的结果是一样的。可以避免脏读和可重复读,但是避免不了幻读。
4、串行化
是最高的隔离级别,强制事务串行执行,避免幻读、不可重复读、脏读问题,串行会在每一行的数据上都加锁,所以可能会导致大量的超时和锁争用问题。只有在确保数据的一致性而且可以接受大量并发的情况下,才考虑采用该级别。