听说普通的 select 不对数据加锁,那岂不是很容易读到某些事务未提交的数据,应该全用 select ... for update ?
1
ferock 2021-03-18 18:14:49 +08:00
可以修改事物隔离级别
|
3
nolo 2021-03-18 18:19:26 +08:00 2
1 、select 也会对数据加锁,读锁。一个简单的现象,你在 select 的时候,ddl 会等待 select 结束。
2 、innodb 支持的四种事务隔离级别,只有 Read Uncommitted 会读到事务未提交的数据。 |
5
hehe12980 2021-03-18 18:23:04 +08:00 1
现在都是 innodb 引擎,在 innodb 下,你 mysql 的普通读 select 是快照读,压根不会加锁,不管是行读锁还是行写锁都不会影响普通 select,快照读会根据 MVCC 版本链 和 read view 去做判断 不会出现读到 某些事物未提交的情况,当然你的事物隔离级别必须是读已提交以上
|
6
killergun 2021-03-18 18:24:24 +08:00
select 在默认情况下都是快照读
|
11
hehe12980 2021-03-18 18:40:49 +08:00
顺便说一句,你说的 select xx for update, 应该是这么一个场景,在我读的时候过程中, 假设有数据正在写并且没有提交,那我要保证我读的是最新的数据,我等到写的事务提交后再读。但是你用快照读也就是普通 select 可能就读不到,正在写但没有提交的这个事物,因为你在我读之前你没有提交,假设这个写的动作很长,在普通 selelct 读完之后,那么他相当于一个未来的事物,我 select 的时候完全不需要关系你未来是怎么变的,我只对当前的操作负责,但是如果你 for update 不会,它会傻傻的等着你写完。
|
14
pisc 2021-03-19 08:17:30 +08:00 via Android
@hehe12980 这。。。你 select for update 写了这么多,本质上和普通的 select 有个锁而已,搞得这么复杂,
|
17
pedia 2021-03-19 10:57:50 +08:00
|
18
nycbdwss 2021-03-19 11:09:07 +08:00
|