是否有办法更新审计表中的记录(通过触发器),而不会因为触发事件的更新而导致该记录被锁定。
所以我们有一个Users表和一个触发器,它在插入,更新,删除时触发并将更改后的值记录到某些Audit表中,但是我不希望锁定审计表,防止触发其他触发器执行操作审计表。
编辑:只是为了澄清,我遇到的问题是多个表通过不同的触发器向同一个审计表报告,因此对一个表的更新会锁定所有其他表的更新。至于如果事务回滚会有什么问题,这不是一个问题,因为审计表只是用于更改跟踪,如果记录回滚,如果审计表不回滚则不是问题。
我已经想到了它可能有用的方法,但我不知道这是否可行(或者如何做),是否有一种方法让触发器使用新连接而不是最初调用的连接? / p>
答案 0 :(得分:0)
创建一个至少不会对正在写入的记录/页面进行写锁定的操作是不可能的。否则,SQL Server会出现一致性问题。您应该从相反的角度来看 - 需要访问审计表的其他进程(审计通常意味着只读而几乎没有更新)应该使用
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
or
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
将从审计表
进行脏读(或无锁定版本) 如果你必须......
有一种偷偷摸摸的方法是使用Service Broker将写入与事务隔离,而不是将数据插入到中间表中,并让SSSB异步激活线程为您写入审计记录,从而允许原始的长期运行事务保持未提交状态。