mysql 默认的级别是可重复读
为什么不用读已提交呢?因为以前 binlog 在 RC 隔离级别下主从复制会出错
但是因为在 RR 级别下,存在间隙锁,导致出现死锁的几率比 RC 的大很多
因此 很多大厂采用 RC 级别
那么问题来了,修改为 RC 级别后,binlog 主从复制为什么不会出错呢??
1 puperSB 2020-03-12 23:08:02 +08:00 首先问问题可不可以不可重复读和 RR 同时用。。。其次现在很多大厂的某些业务也是使用的 读提交 隔离级别。但是有两点要注意。第一,读提交会出现幻读(自己的业务要能忍受),第二主从同步要使用 row 模式。 |
2 chen1164162915 2020-03-13 00:37:25 +08:00 隔离级别玩不明白就 Serializable,select for update 一刀切 |
![]() | 3 CoderGeek 2020-03-13 02:17:54 +08:00 看业务容忍度 |
4 hantsy 2020-03-13 02:23:14 +08:00 每个数据库默认不一样,也不一定所有数据库都支持这 4 种级别。 一般用数据库默认的比较安全。 |
5 littlewing 2020-03-13 08:24:14 +08:00 via iPhone rc 下主从复制会出错,可以举个例子吗 |
6 leorealman 2020-03-13 09:10:53 +08:00 我也想知道为什么大厂采用 RC 而不用 RR,我的理解中 RC 没有严格满足 ACID 的 I 也就是隔离性...我推测是为了更好的并发? |
7 cstj0505 2020-03-13 09:19:35 +08:00 如果你觉得同一个事务以内读到的数据不同没关系,可以改已提交读啊。 |
8 bbao 2020-03-13 09:53:43 +08:00 不明白的事情,设计者帮你想明白了,做了默认的选择; 事务隔离级别可以随时调整,满足业务的场景下,如果觉得自己的对且没问题,测试和生产都可以改,有更多不了解就查阅资料就行了。 |
9 wps353 2020-03-13 10:22:58 +08:00 ![]() 因为在 RC 级别下,binlog 的 format 是 row 格式的就能避免问题。 |
![]() | 10 Aresxue 2020-03-13 10:51:26 +08:00 binlog 的复制方式有两种, 按语句和按行复制, 按语句在幻读发生的情况下就会产生问题,使用严格的行复制就不会有这种问题了 |
11 scnace 2020-03-13 10:53:37 +08:00 via Android gap lock 指的是 autoinc 的主键吗? |
12 githubhaoliu 2020-03-13 11:40:20 +08:00 在 RR 下 Mysql 采用 Next Key Locking 机制避免了幻象问题,Oracle 要在 Serializable 才能实现。安全是数据库第一重要的,再说,可以自己调呀。 |