数据库事务的隔离级别
事务是数据库管理系统的执行单位,可以执行一个数据库操作或是一组数据库操作。事务的ACID属性;事务的四个隔离级别。
事务的隔离级别由高到低分别是:串行化、可重复读、读已提交、读未提交。通常是使用锁来实现隔离的等级,但是在设置中只需要写上等级,对应的锁会由系统自动添加。
隔离级别
串行化
所有事务都一个接一个的串行执行,避免幻读,通过范围锁进行保证。
可重复读
所有被Select的数据都不可以被修改,这样可以避免前后数据不一致的问题,利用读锁。但是会产生幻读,因为只是控制了不能修改,但是可以增加数据
Transaction 1 Transaction 2
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
INSERT INTO users VALUES ( 3, 'Bob', 27 );
COMMIT;
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
读已提交
被读取的数据可以被其他事务修改。数据读取完立即释放读锁(和上一个级别的差距在 不用等事务结束后再释放)
Transaction 1 Transaction 2
SELECT * FROM users WHERE id = 1;
UPDATE users SET age = 21 WHERE id = 1;
COMMIT;
SELECT * FROM users WHERE id = 1;
读未提交
允许其他事务看到没有提交的数据。导致脏读
Transaction 1 Transaction 2
SELECT * FROM users WHERE id = 1;
UPDATE users SET age = 21 WHERE id = 1;
SELECT * FROM users WHERE id = 1;
RollBack
相关概念
幻读
对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读
对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
脏读
对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
总结
隔离级别(使用的锁、避免的问题):串行化(范围锁、幻读)、可重复读(事务完释放读锁、不可重复读)、读已提交(立即释放读锁、脏读)、读未提交
隔离等级 脏读 不可重复读 幻读
读未提交 YES YES YES
读已提交 NO YES YES
可重复读 NO NO YES
串行化 NO NO NO