SQL Server:原子触发器

Posted

技术标签:

【中文标题】SQL Server:原子触发器【英文标题】:SQL Server: Atomic Trigger 【发布时间】:2014-09-04 11:58:49 【问题描述】:

我有两个小问题。

    SqlServer 触发器默认是原子的吗? 如果没有怎么实现?

环境很简单。我有两个用户(我们称他们为 UserA 和 UserB)与数据库有两个不同的连接。两个连接同时处于活动状态。

当 UserA 在特定表中插入一行时,会触发一个触发器(我们称之为 TriggerAtomic)。我需要确保在触发 TriggerAtomic 时,UserB 在 TriggerAtomic 完成之前无法执行任何操作。显然,在 TriggerAtomic 完成之前,没有其他触发器、函数、过程......可以执行。

【问题讨论】:

【参考方案1】:

在 INSERT 语句周围放置一个事务,然后提交它。 SQL 触发器在触发它们的语句的事务中运行。

【讨论】:

完美 ^^ 感谢您的想法【参考方案2】:

是的,触发器是原子的,因为它们在与其父查询相同的事务中执行,它们要么一起提交,要么一起回滚。父查询的事务可以是显式的,正如Tab Alleman's answer 中所建议的那样,但这对于单个语句来说是不必要的,因为如果您没有将查询显式包装在事务中,您将得到一个隐式事务,正如@的答案中所讨论的那样987654322@

好的,但让我们后退一分钟。您使用了 atomic 一词,但从您的描述来看,您的实际目标似乎是 isolation 而不是 atomicity。这是一个令人困惑的主题,因为原子性在并发编程和数据库的世界中意味着两个完全不同的东西:

在编程中,原子性属于互斥。如果一系列动作不会被其他进程中断,那么它就是原子的。在数据库世界中,这个概念被称为隔离。更加混乱的是,原子性通常是一个二元概念,而数据库事务隔离存在于一个范围内。

对于数据库,原子性与是否允许在一系列操作中出现部分故障有关。如果事务是原子的,那么整个序列要么成功,要么都不成功。不允许某些操作成功而某些操作失败的中间状态。这与在执行一系列操作时从资源中排除其他用户无关。

在这种情况下,事务可能就足够了(例如,如果它被设置为“可序列化”的最严格的隔离级别)。但我不是隔离方面的专家,我不确定你的具体情况。各种类型的锁是另一种选择。

更多信息:

Another question 有人在真正需要隔离时要求原子性。显然,在这种特殊情况下建议使用锁。 A great article(实际上是整个系列的第一个)解释了围绕原子性的神话和混乱以及构成首字母缩略词 ACID 的数据库的其他特征 SQL Server Transaction Isolation Levels

【讨论】:

以上是关于SQL Server:原子触发器的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 如何调试触发器!

sql server 触发器一个结果集变化更新到新表

sql server触发器 子查询返回值不止一个 如何解决?

sql server 触发器

SQL Server 触发器

SQL Server 触发器