无间隙序列,其中涉及具有多个表的多个事务

use*_*725 1 c# sql-server oracle postgresql transactions

我(根据法律)要求在不同的表格上使用无间隙数字.ID可以包含空洞但不包含序列.

这是我必须在C#代码或数据库(Postgres,MS SQL和Oracle)中解决的问题.

这是我的问题:

Start transaction 1

Start transaction 2

Insert row on table "Portfolio" in transaction 1

Get next number in sequence for column Portfolio_Sequence (1)

Insert row on table "Document" in transaction 1

Get next number in sequence for column Document_Sequence (1)

Insert row on table "Portfolio" in transaction 2

Get next number in sequence for column Portfolio_Sequence (2)

Insert row on table "Document" in transaction 2

Get next number in sequence for column Document_Sequence (2)

Problem occurred in transaction 1

Rollback transaction 1

Commit transaction 2
Run Code Online (Sandbox Code Playgroud)

问题:差距顺序都Portfolio_SequenceDocument_Sequence.

请注意,这是非常简化的,并且每个事务中都包含更多表.

我怎么处理这个?

我已经看到建议你"锁定"序列,直到事务被提交或回滚,但是当涉及这么多表和这个复杂的长事务时,这将是系统的一个巨大停顿.

Mar*_*bak 6

正如您已经得出的结论,无间隙序列根本无法扩展.您可能会在发生回滚时冒着丢弃值的风险,或者您有一个序列化点可以阻止多用户并发事务系统进行扩展.你不能两者兼得.

我的想法是,后处理行动怎么样,每天,你有一个在业务结束时运行的流程,检查差距,并重新编号需要重新编号的任何东西?

最后一个想法:我不知道你的要求,但是,我知道你说这是"法律规定的".那么,问问自己,人们在有电脑之前做了什么?如何满足这个"要求"?假设你有一堆空白表格在右上角预先印有"序列"号码?如果有人在那个表格上洒咖啡会怎么样?怎么处理?看来你需要一个类似的方法来处理你的系统.

希望有所帮助.