【四月更文打卡】数据库事务的隔离级别

299 阅读2分钟

数据库事务的隔离级别

事务是数据库管理系统的执行单位,可以执行一个数据库操作或是一组数据库操作。事务的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