写写并发在 RC 级别需要解决 Lost update 的问题,同时在 RR 级别下也需要进行对于不可串行化的判断。
什么情况会出现6001,写写并发不是有事务隔离机制吗,上面的描述怎么理解
6001是在执行并发写操作时,检测到写写冲突后主动返回的错误码。即使事务隔离级别是RC或RR,仍然可能因为RR级别下检测到不可串行化的写写冲突或RC级别下检测到Lost update无法通过MVCC自动解决或多版本并发控制+ 乐观并发控制机制下,写写冲突无法自动解决返回6001错误。试试优化事务粒度、减少热点行写操作。
错误码 6001 (ERROR 6235 (25000): can't serialize access for this transaction) 出现在 OceanBase 数据库的可串行化(或可重复读)隔离级别下。在这个隔离级别,事务中的 UPDATE、DELETE、SELECT FOR UPDATE 等更新操作在搜索目标行时,只会看到事务开始前已经提交的行版本。如果在事务执行过程中,同一行被其他并发事务更新并提交,当前事务在尝试更新时就会检测到写写冲突,导致当前事务回滚,并返回错误码 6001。
尽管在读已提交(RC)隔离级别下,写写并发已经通过事务隔离机制解决了一部分问题,但在可重复读(RR)隔离级别下,还需要确保事务之间的串行化执行,以防止不可串行化的现象。因此,在 RR 隔离级别下,事务不仅需要处理写写冲突,还需要确保事务之间的串行化顺序,避免丢失更新(Lost Update)和其他并发异常。
更多信息请查看:
如果在事务执行过程中,同一行被其他并发事务更新并提交,当前事务在尝试更新时就会检测到写写冲突,事务之间不是有锁隔离的吗,为啥会被其他事务提交呢?还有,大事务读取数据的操作是一次性读取事务涉及到所有行吗,这时候数据被其他事务加锁了,就会提示6001?
学习了