@leichnX 你需要查询 account 和 order 两张表,查询 account 后你会获取到一个余额,然后再查询 order 时你肯定希望此时查询的明细就是查询 account 那一瞬间对应的 order ,不然如果 order 被修改了,你的 order 和 account 会对不齐。
这里的可重复读不止针对同一条数据的可重复读,如你所说业务上也许不会在事物内针对同一条数据查两遍, 但是跨表的可重复读是很有用的。
@git00ll 又测了一下,你说的是对的,我开始拿 SERIALIZABLE 测了一遍,结果和我说的一样,我想当然的以为可重读也是会读到新插数据或改的数据。然而可重读读到的还真是旧数据,这很牛逼,很重要。
事务 A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
SELECT *
FROM 表 1 ;
转过去执行事务 B
SELECT *
FROM 表 2 ; //发现读到的是旧数据
commit;
事务 B
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
UPDATE 表 2
SET Name='22'