代码之家  ›  专栏  ›  技术社区  ›  Kapil D

触发器是异步的吗?

  •  4
  • Kapil D  · 技术社区  · 14 年前

    我有一个表A,它维护表B中的总用户数。我只关心表A中的用户数与表B中的用户数同步。

    因此,每当我在表B中插入一个用户时,我希望根据用户的插入或删除来增加/减少计数。

    有两种方法: a)如果我要在表B中插入行,我可以在一个存储过程中发布表A的更新计数。这将导致插入两个命令,然后进行更新。所以说,2秒。(假设1秒内每个txn)

    b)我可以在存储过程中编写insert命令。另外,定义一个触发器,在表A中的插入完成后更新表A中的计数。对我来说,这只需要1秒钟的时间,这只需要在表B中插入行。 我假定更新表B中的计数的“after insert触发器”发生在后台,因此是异步的或非阻塞的。

    这一假设是正确的还是两种方法都需要相同的时间。

    注意:我不关心表A中更新计数的时间。因此,我正在寻找一种在非阻塞模式下执行同步作业的方法,就像在队列中一样!

    有什么建议/意见吗?

    1 回复  |  直到 14 年前
        1
  •  8
  •   MarkR    14 年前

    不,触发器是以存储过程的相同方式绝对同步执行的。这意味着,如果您开始执行诸如更新触发器中的计数之类的操作,您可以使用autocommit执行的简单查询在事务中做很多工作,因此很可能会死锁。你应该知道这一点。

    如果您不希望它是同步的,我想您可以让它执行一个插入到挂起更改表中的操作,然后有一个异步进程来更新它。从长远来看,这可能会避免很多死锁(插入到没有二级索引的表中,不能与另一个插入到同一个表中的插入死锁,afaik)