我正在编写一些将在生产环境中运行的日志记录/审计代码(不仅是在引发错误时或在开发过程中)。阅读Coding Horror's experiences with dead-locking and logging之后,我决定应该寻求建议。 (杰夫的“不记录”解决方案对我不起作用,这是法律规定的安全审核)
是否有合适的隔离级别,以最大程度地减少争用和死锁?我可以添加到插入语句或存储过程中的任何查询提示吗?
我非常关心除审计表以外的所有事务的事务完整性。这样做的想法是,将会记录太多日志,因此如果一些条目失败了,这不是问题。如果日志记录停止了其他事务,那将是不好的。
我可以登录数据库或文件,尽管登录文件的吸引力较弱,因为我需要能够以某种方式显示结果。记录到文件将(几乎)保证记录不会干扰其他代码。
最佳答案
普通事务(即READ COMMITTED)插入已经执行了“最小”锁定。无论插入如何与其他操作混合使用,插入密集型应用程序都不会在插入上造成死锁。在最坏的情况下,密集的插入系统可能会导致发生插入的热点上的页面闩锁争用,但不会导致死锁。
如Jeff所描述,要导致死锁,必须发挥更多作用,例如以下任何一种情况:
lock
语句),导致无法检测到的死锁(即应用程序挂起)。考虑到解决问题涉及查看流程转储,我想这就是他们所遇到的情况。 因此,只要您仅在READ COMMITTED隔离级别事务中插入日志,就可以保证安全。如果您预期我怀疑存在相同的问题(即涉及应用程序层锁的死锁),那么就没有多少数据库向导可以为您省钱,因为即使您登录单独的事务或进入单独的连接,该问题仍然会显现出来。