本文主要介绍 OceanBase 数据库由于不支持 SELECT ... FOR UPDATE 的 SKIP LOCKED 子句而引起迁移问题的解决方式。
适用版本
OceanBase 数据库 V2.2.73 前的版本。
OceanBase 数据库 V2.2.73 版本起,支持 SELECT ... FOR UPDATE 的 SKIP LOCKED 子句。
规避方式
有两种解决方式:
将 SQL 语句中的
FOR UPDATE替换为FOR UPDATE NOWAIT。添加 version 字段或时间戳字段作为更改指示器,手动设置乐观锁,例如:
UPDATE addressTableSET address_line1 = `<<new address line 1>>`,city = `<<new city>>`,state = `<<new state>>`,zip = `<<new zip>>`,version = version + 1WHERE address_id = `<<some key>>`AND version = `<<version you read initially>>`;
注意
- 从数据源访问时间戳存在性能问题。
- timestamp 类型的锁受到数据库存储 timestamp 类型的精度限制,因此建议使用 numeric 类型的锁。