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_Sequence和Document_Sequence.
请注意,这是非常简化的,并且每个事务中都包含更多表.
我怎么处理这个?
我已经看到建议你"锁定"序列,直到事务被提交或回滚,但是当涉及这么多表和这个复杂的长事务时,这将是系统的一个巨大停顿.
正如您已经得出的结论,无间隙序列根本无法扩展.您可能会在发生回滚时冒着丢弃值的风险,或者您有一个序列化点可以阻止多用户并发事务系统进行扩展.你不能两者兼得.
我的想法是,后处理行动怎么样,每天,你有一个在业务结束时运行的流程,检查差距,并重新编号需要重新编号的任何东西?
最后一个想法:我不知道你的要求,但是,我知道你说这是"法律规定的".那么,问问自己,人们在有电脑之前做了什么?如何满足这个"要求"?假设你有一堆空白表格在右上角预先印有"序列"号码?如果有人在那个表格上洒咖啡会怎么样?怎么处理?看来你需要一个类似的方法来处理你的系统.
希望有所帮助.