我对触发器中的事务有一些疑问,但我还没有找到答案。
CREATE TRIGGER A_AI ON A
AFTER INSERT AS
BEGIN TRY --is the try block 1 transaction ? or do I have to begin the transaction?
--BEGIN TRAN: may I start the transaction like this?
-- SOME DANGEROUS OPERATIONS
COMMIT --has this sense here?
END TRY
BEGIN CATCH --silent catch no rasing errors.
ROLLBACK TRANSACTION -- does it work without BEGIN TRANSACTION? if so, is it the whole try block?
END CATCH
GO
答案 0 :(得分:5)
触发器总是在事务的上下文中执行 - 每个DML语句都在事务中运行。在SQL Server中将Implicit Transactions设置为commit automatically这一事实通常会隐藏这一点。
如果从触发器内发出回滚,这将(与往常一样使用回滚)回滚所有事务,无论是否嵌套。
一般情况下,你不会在触发器中提交,除非(如在你注释掉的例子中)你明确地打开一个嵌套事务。
如果您的问题还有其他方面,我将无法弄清楚您发布的示例中的内容。虽然我总是喜欢在询问SQL问题时发布实际SQL的人,但有时候一些评论或实际问题的项目符号列表都可以提供帮助。