本文于 16 天前发布,最后更新于 10 天前
一、问题描述
MVCC 多版本并发控制是指维持一个数据的多个版本,在保证事务隔离级的情况下,使得读写操作没有冲突,提高了数据库并发读写的性能。
因此可以解决在并发读写数据库时,做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作。
当对一张表批量修改且并发量较大时,可能会报 MVCC 多版本操作冲突过多的错误。多会话同时修改表数据时报错:Too many mvcc conflict。
二、问题解决
修改数据库dm.ini
文件中静态参数MVCC_RETRY_TIMES
和BDTA_SIZE
,重启数据库。
参数名称 | 参数描述及建议 | 属性 |
MVCC_RETRY_TIMES | 指定发生 MVCC 冲突时的最大重试次数。有效值范围(0~4294967294) 注:MPP 下此参数无效,发生 MVCC 冲突时将直接报错。 | 静态 |
BDTA_SIZE | BDTA 缓存的记录数。有效值范围(1~10000)。 | 静态 |
修改MVCC_RETRY_TIMES
参数值为 100,重启数据库。
修改SQL
SP_SET_PARA_VALUE(2, 'MVCC_RETRY_TIMES', 100);
--或者
ALTER SYSTEM SET 'MVCC_RETRY_TIMES' = 100 SPFILE;
参数分析
MVCC_RETRY_TIMES 参数越大,发生 MVCC 冲突时的最大重试次数越多,报错可能性越低。
BDTA_SIZE 参数越大,批量数据处理大小(BDTA 的大小)越大,报错可能性越大。
注意
在实际业务场景中,同一时刻并发执行修改同一条数据会导致此报错,建议分析确认应用中同一时刻不同事务修改同一条数的业务合理性。达梦中控制并发冲突次数的参数为MVCC_RETRY_TIMES
,默认为 5,该参数可从一定程度上缓解冲突的概率。但该错误信息不是并发操作触发锁机制控制锁等待,而是同一时刻不同的事务修改同一条数据导致,故要综合评估业务逻辑的合理性来进行解决。