加锁的范围

请教个问题,就是假如我一个事务里更新一百万行数据,此时是一百万数据都被加锁了吗,此时如果读取数据,会怎么样呢,必须等待事务执行完成释放锁才能读,还是直接可以读取数据呢。事务隔离级别采用默认的。

写不会阻碍读的,读会读到更新前的老版本数据

可以了解下 mvcc。 事务隔离级别 读已提交(快照读) 的相关技术解释。

101里事务那部分讲了

系统默认采用悲观事务,会在prewrite阶段先加锁,加锁的逻辑是先给事务第一行加primary锁,其他行加一个指向primary锁的锁。
此时如果有其他事务读数据,是可以的。因为TSO肯定比这个事务提交的TSO小,所以,读取到的数据版本与本次事务修改的数据无关(不会发生脏读),与本次事务新增的数据也无关(不会幻读)。

加锁是两阶段加锁,prewrite前加锁,读取是走MVCC机制,不会被写所阻塞

加锁位置是在数据和索引上都有的,看情况的,读取使用快照读,不影响的
参考:

https://docs.pingcap.com/zh/tidb/stable/pessimistic-transaction#tidb-悲观事务模式

写和读都是snapshot,根据事务设置的级别,rc是读已提交的。