declare
_max1 int;
_max2 int;
begin
lock table 征收协议 in exclusive mode;
SELECT MAX(CONVERT(INT, ISNULL(选房顺序号, 0))) into _max1
FROM 征收协议
INNER JOIN 审批表 ON 审批表.ID = 征收协议.审批表ID
INNER JOIN 产权情况 ON 产权情况.审批表id = 产权情况id
WHERE 作废日期 IS NULL;
SELECT MAX(CONVERT(INT, ISNULL(产权选房顺序号, 0))) into _max2
FROM 产权情况
INNER JOIN 审批表 ON 审批表.ID = 产权情况.审批表ID
WHERE 作废日期 IS NULL;
UPDATE 征收协议 SET 选房顺序号 =
RIGHT(CONCAT('000', CONVERT(NVARCHAR(10), ISNULL(GREATEST(_max1,_max2), 0) + 1)), 4)
FROM 征收协议
INNER JOIN 审批表 ON 审批表.ID = 征收协议.审批表ID
WHERE 作废日期 IS NULL AND 征收协议.审批表id={0} AND 选房顺序号 IS NULL;
commit;
end;
这段代码如果不通Session同时运行会得到相同的【选房顺序号】这样不正确,如果相同逻辑我在mysql,ms sqlserver,oracle都可以得到新增加的值。如果用达梦想这么写如何处理呢?
可尝试在内层获取相应行时以rowid或其他有效字段关联并从外层赋值及行级for update处理并观察是否解决
这里面有commit,并发下下个查询在update提交之后,可以查到不同的值吧