https://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2
总所周知,数据库事务有四个特性,原子性,一致性,隔离性,持久性。下面具体谈谈隔离性。
隔离性与事务并发紧密联系在一起。而隔离级别又与并发速度相关,隔离级别高,必然影响并发速度;隔离级别低,速度虽然提升,但可靠性又会有问题。
因此,现实中要根据具体情况做出权衡。不像某无脑游戏,强者各方面都强,更不像某意淫小说,天下好事尽在我手。现实就是,有得必有失。
废话不说,隔离的四个级别,由高到低分别是:
1,可序列化: 事务执行完前,读锁写锁一直保持。select时获得范围锁。最强隔离等级。解决幻读,不可重复读,脏读等问题。
2,可重复读:事务执行完前,读锁写锁一直保持。但select时不获得范围锁。解决不可重复读,脏读问题。无法解决幻读。
3,提交读:事务执行完前,写锁一直保持。解决脏读问题。无法解决不可重复读,幻读。
4,未提交读:最低的隔离级别。允许“脏读”,事务可以看到其他事务“尚未提交”的修改。
什么是幻读呢?
就是事务执行时,两次完全相同的查询操作得到不同的结果。
主要是没有获得范围锁,读时,被插入了一条新数据。虽然有读锁,写锁,但仍会出现此问题。
什么是不可重复读?
主要是,读锁没有一直保持,导致读时被插入新值。注意是值级别,幻读是表级别,被插入新行。
什么是脏读?
主要是写锁没有一直保持,读时出现读取修改但未提交的数据。
Oracle默认隔离级别:提交读;MySql默认隔离级别:可重复读。
可见凡事不可求全。对于一个工程人员来说,实际最优与理论最优永远有差距。