如何处理乐观锁并发提交元数据冲突
在并发写入Iceberg表时,通常会遇到两类冲突:并发提交数据冲突、乐观锁并发提交元数据冲突。
本文介绍乐观锁并发提交元数据冲突。
乐观锁并发提交元数据冲突的产生原因:多个修改作业(包括Insert、Update、Delete、MergeInto以及表服务操作)同时在LakeFormation上提交导致的并发提交冲突。例如:

上图中,Transaction1和Transaction2分别为两个DML事务,Transaction1基于元数据版本version1进行数据处理和提交,并将元数据版本更新至version2,而Transaction2在Transaction1提交前已经基于元数据版本version1开始了数据处理,在首次提交时,LakeFormation拒绝提交,因为此时元数据已经更新为version2,需要由Transaction2更新元数据后,再次提交。
在这种场景下,如果并发量非常大,或者某个事务做冲突检测的时间过久,则会陷入“提交冲突->更新元数据->检测冲突->再次提交”的死循环,导致业务冲突报错。
为解决上述问题,Iceberg引入四个参数,具体参数说明请参见表1。