数据库事务的四种隔离性及Oracle\MySQL默认隔离级别和原因分析 | 运维进阶

啊对对对,ACID,知道吧。
多个人用数据库,那事儿就多了。
隔离性,就是关键。

ReadUncommitted...这个,允许脏读啊。
就是你读到别人没提交的数据,可能一会就改了。
但并行度高,快。
就是最不靠谱的。

ReadCommitted...这个好点,脏读不让你读到了。
Oracle默认就是这个。
数据基本一致了。
但不可重复读,还是可能发生。
就是你事务里重复读,结果数据被别人改了。

RepeatableRead...这个防止了不可重复读。
怎么防的呢?行锁,把数据锁住。
事务里读啥,就一直不变。
但幻读,它不管。
就是读的时候没看到新插入的数据。

Serializable...最狠的,完全串行。
啥都不漏。
脏读、不可重复读、幻读,全没。
但并发性能,就差了。
跟排队一样。

Oracle为啥用ReadCommitted?传统行业,读写差不多,可能对并发要求没那么高。
MySQL为啥用RepeatableRead?互联网,读多,要快。
高并发读,这个还行。

选哪个,看情况。
一致性,还是并发,得自己掂量。
Oracle可能ReadCommitted对付读多写少还行。
MySQL读多,RepeatableRead可能够用。
但复杂点,还是得往上提。

Mysql数据库之隔离级别

隔离级别是控制事务干扰程度。
MySQL默认REPEATABLE READ。

REPEATABLE READ用快照读。
事务开始建快照,后续读共享这个快照。
避免读取到中间修改的数据。

当前读要加锁。
SELECT...FOR UPDATE是典型。
会锁住索引,防止其他事务修改。

比如SessionA更新id>4 的记录,SessionB不能插入id=5 的新记录。

READ COMMITTED用最新快照读。
每次读都拿最新数据。
可能读到其他事务刚提交但还没同步的变更。

当前读加锁类似REPEATABLE READ,但间隙锁不生效。
所以会出幻读。

比如SessionA读范围数据,SessionB插入同范围数据。
SessionA下次读会看到新增数据。

REPEATABLE READ保证一致性。
READ COMMITTED提升性能,但可能出现幻读。

怎么选?看你要一致性还是性能。

MySQL事务中四种隔离级别

这四种MySQL事务隔离级别,简单来说:
1 . 未提交读:就像偷看别人日记,别人还没写完,你就能看到,风险大,几乎不用。

2 . 已提交读:别人写完日记,你才能看,但别人可以随时写新日记,你看到的可能不是完整的。

3 . 可重复读:你开始看别人日记后,别人不能写新日记,但你看到的内容别人可以改。

4 . 可串行化:别人写日记时,你得排队等着,别人不能写,你也不能看。

总结:想快,就用低的;想稳,就用高的。
MySQL默认的可重复读,就是速度和稳定的平衡点。