链式事务可以在 Sybase ASE 的非链式事务中实现吗?

Can a chained transaction be implemented within an unchained transaction in Sybase ASE?

假设有 2 个表:Table test 和 Table test_copy。我在 Table 测试中有一个插入触发器,它插入 Table test_copy 并且我有一个存储过程用于在 Table 测试中插入。

我正在通过存储过程在测试中做一些批量插入。假设有 7 条记录。如果第 6 条记录有错误,我希望测试中的整个事务回滚,但 test_copy 保留 5 条记录。

如何在Sybase ASE 中实现? 如果我在链式模式下声明触发器并且在非链式模式下声明存储过程,这是否可以实现?

在触发器内执行的操作被认为是修改父级 table(定义触发器的同一事务)的一部分。

如果你向测试 table 插入记录,而测试 table 的插入触发器执行向 test_copy table 的插入,则没有办法将两组插入分开,即,将它们视为一个工作单元:

  • 提交要测试的插入,然后将插入提交到 test_copy
  • 回滚要测试的插入,然后将插入回滚到 test_copy

如果您想将两组插入(一组用于测试;另一组用于 test_copy)作为单独的工作单元,那么您需要对 test_copy 执行插入作为单独的独立插入语句(例如,存储过程必须 运行 insert test/select from #tableinsert test_copy/select from #table)。


虽然 Sybase ASE 允许以编程方式更改事务模式(链接与非链接),但此设置应用于会话级别而不是事务级别;最终结果是您不能将链式和非链式交易相互嵌套。