这是一个创建于 1361 天前的主题,其中的信息可能已经有所发展或是发生改变。
是否 autocommit,隔离级别是 Read Uncommit 还是 Repeatable Read ?
上次去面试人家问我,说隔离级别,我就说了自己理解的 RR,select 过程加读锁,其他事务没法加写锁,避免其他事务修改我们 select 的记录。对面就笑了:单单 select 就会加锁吗?你确定?我说理论上是这样的,实际中 Innodb 通过 MVCC 来避免加锁。
然后就是一段时间的争执,对方认为 select 不会加锁,我也就重复自己的观点。
然后对方问我之前公司用的隔离级别是什么,我说默认的 RR 。问到幻读,说你们是怎么解决幻读的。我就卡壳了,没遇到过啊,Innodb 不是不会幻读吗。最后驴唇不对马嘴地扯了半天,说可以借鉴 MVCC 自己添加版本字段,各个事务只操作自己版本的记录。最后才明白对方想得到 select for update 的答案。
后来又翻了技术内幕那本书,才发现 innodb 在 RR 级别下才会用 Next-key lock 解决幻读,而 RC 级别下只有行锁,所以会有幻读。
自己确实缺少实操经验,所以想问问大家实际生产环境中数据库怎么设置的。
3 条回复 • 2021-01-30 14:19:16 +08:00
|
|
1
xuanbg 2021-01-30 13:20:35 +08:00
默认配置
|
|
|
2
louettagfh 2021-01-30 14:07:28 +08:00
1. select 是否加锁要看是什么类型的 select 语句: * 快照读不需要加锁, MVCC 的 undo log 能保证读到正确的数据. * shard mode 加 s 锁. * for update 加 x 锁.
2. InnoDB 使用 Next-key Lock 解决了 RR 部分场景下的幻读,也不是完全的避免幻读.
|
|
|
3
yzbythesea 2021-01-30 14:19:16 +08:00
有一说一还是 nosql 简单。sql 这种就应该在生产服务上淘汰。
|