事务在 Microsoft SQL Server 中的工作原理
How exactly transactions work in Microsoft SQL Server
我读到创建 for insert trigger
会隐式创建事务。所以我可以从触发器中回滚事务并“撤消”插入。
是这样吗?
create trigger TRIGGER_NAME
on TABLE_NAME
for insert
as
declare @someVar = ....
if @someVar > 0
begin
rollback transaction
end
那么在那种情况下,如果@someVar
大于0,插入将被取消,对吗?
create trigger TRIGGER_NAME
on TABLE_NAME
for insert
as
begin transaction
declare @someVar = ....
if @someVar > 0
begin
rollback transaction
end
commit transaction
那样的话,insert也取消了吧?
当我们有两个 for insert trigger
用于相同的 table 时会发生什么,并且他们都这样做 rollback transaction
他们共享相同的隐式交易吗?
我遇到了一些复杂的事情,所以我尝试在每个触发器中创建我自己的显式事务,但是对于 begin transaction
我无法做任何事情来正确使用 inserted
,我无法从中提取任何值。
其实一个事务就是会话的状态。没有其他的。因此,您可以处于交易状态或不处于交易状态。当您执行 SQL 查询(不同于“命令”)时,会有一个包含查询的隐式事务。当您在触发器代码中时,事务状态是活动的,您可以回滚或提交。如果在触发器代码中执行此命令(COMMIT 或 ROLLBACK)中的任何一个,您将引发一个执行...但是事务状态不再存在,直到您执行任何查询。
现在,如果您有多个触发器,则可以使用过程 sp_settriggerorder.
来管理触发器的串行执行优先级
不建议对同一操作使用多个触发器,除非您必须按特定顺序执行它们。作为我在课程中给出的示例,我将同一操作的触发器数量限制为三个,具有这种特殊的优先级:
- 触发基于集合的约束
- 操作过程的触发器(客户端应用程序)
- 触发跟踪
我读到创建 for insert trigger
会隐式创建事务。所以我可以从触发器中回滚事务并“撤消”插入。
是这样吗?
create trigger TRIGGER_NAME
on TABLE_NAME
for insert
as
declare @someVar = ....
if @someVar > 0
begin
rollback transaction
end
那么在那种情况下,如果@someVar
大于0,插入将被取消,对吗?
create trigger TRIGGER_NAME
on TABLE_NAME
for insert
as
begin transaction
declare @someVar = ....
if @someVar > 0
begin
rollback transaction
end
commit transaction
那样的话,insert也取消了吧?
当我们有两个 for insert trigger
用于相同的 table 时会发生什么,并且他们都这样做 rollback transaction
他们共享相同的隐式交易吗?
我遇到了一些复杂的事情,所以我尝试在每个触发器中创建我自己的显式事务,但是对于 begin transaction
我无法做任何事情来正确使用 inserted
,我无法从中提取任何值。
其实一个事务就是会话的状态。没有其他的。因此,您可以处于交易状态或不处于交易状态。当您执行 SQL 查询(不同于“命令”)时,会有一个包含查询的隐式事务。当您在触发器代码中时,事务状态是活动的,您可以回滚或提交。如果在触发器代码中执行此命令(COMMIT 或 ROLLBACK)中的任何一个,您将引发一个执行...但是事务状态不再存在,直到您执行任何查询。
现在,如果您有多个触发器,则可以使用过程 sp_settriggerorder.
来管理触发器的串行执行优先级不建议对同一操作使用多个触发器,除非您必须按特定顺序执行它们。作为我在课程中给出的示例,我将同一操作的触发器数量限制为三个,具有这种特殊的优先级:
- 触发基于集合的约束
- 操作过程的触发器(客户端应用程序)
- 触发跟踪