事务隔离说明
Vastbase 基于 MVCC(多版本并发控制)并结合两阶段锁的方式进行事务管理,其特点是读写之间不阻塞。SELECT 是纯读操作,UPDATE 和 DELETE 是读写操作。
• 读写操作和纯读操作之间并不会发生冲突,读写操作之间也不会发生冲突。每个并发事务在事务开始时创建事务快照,并发事务之间不能检测
到对方的更改。
读已提交隔离级别中,如果事务 T1 提交后,事务 T2 就可以看到事务T1 更改的结果。
可重复读级别中,如果事务 T1 提交事务前事务 T2 开始执行,则事务T1 提交后,事务 T2 依旧看不到事务 T1 更改的结果,保证了一个事务开始后,查询的结果前后一致,不受其他事务的影响。
• 读写操作,支持的是行级锁,不同的事务可以并发更新同一个表,只有更新同一行时才需等待,后发生的事务会等待先发生的事务提交后,再
执行更新操作。
READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。
REPEATABLE READ:事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改。
写入和读写操作
关于写入和读写操作的命令:
• INSERT,可向表中插入一行或多行数据。
• UPDATE,可修改表中现有数据。
• DELETE,可删除表中现有数据。
• COPY,导入数据。
INSERT 和 COPY 是纯写入的操作。并发写入操作,需要等待,对同一个表的操作,当事务 T1 的 INSERT 或 COPY 未解除锁定时,事务 T2 的 INSERT 或COPY 需等待,事务 T1 解除锁定时,事务 T2 正常继续。UPDATE 和 DELETE 是读写操作(先查询出要操作的行)。UPDATE 和 DELETE执行前需要先查询数据,由于并发事务彼此不可见,所以 UPDATE 和 DELETE操作是读取事务发生前提交的数据的快照。写入操作,是行级锁,当事务 T1和事务 T2 并发更新同一行时,后发生的事务 T2 会等待,根据设置的等待时长,若超时事务 T1 未提交则事务 T2 执行失败;当事务 T1 和事务 T2 并发更新的行不同时,事务 T1 和事务 2 都会执行成功。
并发写入事务的潜在死锁情况
只要事务涉及多个表的或者同一个表相同行的更新时,同时运行的事务就可能在同时尝试写入时变为死锁状态。事务会在提交或回滚时一次性解除其所有锁定,而不会逐一放弃锁定。例如,假设事务 T1 和 T2 在大致相同的时间开始:
• 如果 T1 开始对表 A 进行写入且 T2 开始对表 B 进行写入,则两个事务均可继续而不会发生冲突;但是,如果 T1 完成了对表 A 的写入操作并需要开始对表 B 进行写入,此时操作的行数正好与 T2 一致,它将无法继续,因为 T2 仍保持对表 B 对应行的锁定,此时 T2 开始更新表 A 中与 T1 相同的行数,此时也将无法继续,产生死锁,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时
后,事务抛错,有一个事务退出。
• 如果 T1,T2 都对表 A 进行写入,此时 T1 更新 1-5 行的数据,T2 更新6-10 行的数据,两个事务不会发生冲突,但是,如果 T1 完成后开始对表 A 的 6-10 行数据进行更新,T2 完成后开始更新 1-5 行的数据,此时两个事务无法继续,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事务退出。




