【问题标题】:SQL Server: Atomic TriggerSQL Server:原子触发器
【发布时间】:2014-09-04 11:58:49
【问题描述】:
我有两个小问题。
- SqlServer 触发器默认是原子的吗?
- 如果没有怎么实现?
环境很简单。我有两个用户(我们称他们为 UserA 和 UserB)与数据库有两个不同的连接。两个连接同时处于活动状态。
当 UserA 在特定表中插入一行时,会触发一个触发器(我们称之为 TriggerAtomic)。我需要确保在触发 TriggerAtomic 时,UserB 在 TriggerAtomic 完成之前无法执行任何操作。显然,在 TriggerAtomic 完成之前,没有其他触发器、函数、过程......可以执行。
【问题讨论】:
标签:
sql
sql-server
triggers
atomic
transaction-isolation
【解决方案1】:
在 INSERT 语句周围放置一个事务,然后提交它。 SQL 触发器在触发它们的语句的事务中运行。
【解决方案2】:
是的,触发器是原子的,因为它们在与其父查询相同的事务中执行,它们要么一起提交,要么一起回滚。父查询的事务可以是显式的,正如Tab Alleman's answer 中所建议的那样,但这对于单个语句来说是不必要的,因为如果您没有将查询显式包装在事务中,您将得到一个隐式事务,正如@的答案中所讨论的那样987654322@
好的,但让我们后退一分钟。您使用了 atomic 一词,但从您的描述来看,您的实际目标似乎是 isolation 而不是 atomicity。这是一个令人困惑的主题,因为原子性在并发编程和数据库的世界中意味着两个完全不同的东西:
在这种情况下,事务可能就足够了(例如,如果它被设置为“可序列化”的最严格的隔离级别)。但我不是隔离方面的专家,我不确定你的具体情况。各种类型的锁是另一种选择。
更多信息: