SQL触发器是否按顺序运行?

时间:2016-03-02 19:01:45

标签: mysql sql triggers transactions

好的,我已经在很长一段时间以来一直在研究SQL,并编写了各种复杂的查询。但不知何故,我无法掌握与一些事情相关的基本概念。

我的问题是:

  1. SQL查询是否并行运行? (我认为它们不是因为你不能同时在同一个表中同时更改数据的2个查询,对吧?你不能确保主键或自动增量或唯一索引那样,对吗?)

  2. 触发器如何工作?例如我最近写了一个触发器,以防止mysql中的医生双重预订。它是一个BEFORE INSERT触发器。它的作用是,检查表格中的所有条目,并查看同一时间是否已在同一日期预约同一位医生。对于找到的每个这样的行,它将初始化为0的变量递增。如果在while循环结束时,此变量的值大于零,则取消查询(由Laravel处理)。否则,我允许查询成功完成。 我的问题是,如果有两个人在同一时间按下按钮,触发器会并行运行吗?不,对吧?

  3. 希望找到非常简单和准确的答案。互联网上的文章总是太混乱了。

1 个答案:

答案 0 :(得分:3)

SQL代码(包括触发器中的代码)可以并行运行。但是,SQL使用锁来确保事务是原子的并且使用一致的数据。如果两个更新语句尝试更新同一行数据,则其中一个将首先锁定该行 - 阻止另一个事务暂时更新它。一旦完成,它将释放锁定,然后第二次更新将被允许继续。如果需要将它们全部保持原子状态,您还可以拥有跨多个语句的事务。对于SELECT语句,它们通常可以忽略锁(取决于锁类型),因为它们只是检索数据。两条SELECT语句不会相互踩踏。

如果两个人同时推动你的理论按钮,其中一个将是"第一个"他们的交易将首先通过。也就是说,在这里使用触发器听起来是一个非常糟糕的主意,IMO。如果医生永远不允许双书,那么使用声明性RI来强制执行 - 不是触发器(这会导致额外的,通常是显着的开销)。