【发布时间】:2011-02-03 23:48:18
【问题描述】:
有没有办法更新审计表中的记录(通过触发器),而不会因为触发触发器的更新在事务内部而锁定该记录。
所以我们有一个用户表和一个触发器,它在插入、更新、删除时触发并将更改的值记录到某个审核表中,但是我不希望审核表被锁定以防止其他触发器触发执行操作审计表。
编辑: 澄清一下,我遇到的问题是多个表通过不同的触发器向同一个审计表报告,因此对一个表的更新会锁定所有其他表的更新。至于事务是否回滚的问题,这不是一个问题,因为审计表只是用于更改跟踪,如果记录回滚,如果审计表不回滚也不是问题。
我想到了一种可行的方法,但我不知道这是否可行(或如何实现),有没有办法让触发器使用新连接而不是最初调用的连接?
【问题讨论】:
-
如果事务回滚,您真的希望另一个进程读取审计表中的记录吗?
-
我认为,是的,您确实希望锁定审计表的数据。您真正的问题可能是您在审计表上有一个顺序(可能是聚集的)主键索引,它会热点审计表的叶节点,导致所有插入审计表到同一个叶节点页面中时间。将主键更改为具有更多随机排序的东西,这应该可以解决您的锁定问题。
标签: sql transactions deadlock