2

我有两个快速的问题。

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

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

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

4

2 回答 2

5

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

于 2014-09-04T12:35:33.473 回答
2

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

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

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

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

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

更多信息:

于 2019-03-08T18:08:07.337 回答