我正在编写一些将在生产环境中运行的日志记录/审计代码(不仅是在引发错误时或在开发过程中)。阅读Coding Horror's experiences with dead-locking and logging之后,我决定应该寻求建议。 (杰夫的“不记录”解决方案对我不起作用,这是法律规定的安全审核)

是否有合适的隔离级别,以最大程度地减少争用和死锁?我可以添加到插入语句或存储过程中的任何查询提示吗?

我非常关心除审计表以外的所有事务的事务完整性。这样做的想法是,将会记录太多日志,因此如果一些条目失败了,这不是问题。如果日志记录停止了其他事务,那将是不好的。

我可以登录数据库或文件,尽管登录文件的吸引力较弱,因为我需要能够以某种方式显示结果。记录到文件将(几乎)保证记录不会干扰其他代码。

最佳答案

普通事务(即READ COMMITTED)插入已经执行了“最小”锁定。无论插入如何与其他操作混合使用,插入密集型应用程序都不会在插入上造成死锁。在最坏的情况下,密集的插入系统可能会导致发生插入的热点上的页面闩锁争用,但不会导致死锁。

如Jeff所描述,要导致死锁,必须发挥更多作用,例如以下任何一种情况:

  • 系统正在使用更高的隔离级别(那时他们已经来了,这是当之无愧的)
  • 他们在事务期间从日志表中读取(因此不再是“仅追加”)
  • 死锁链涉及应用程序层锁(即log4net框架中的.Net lock语句),导致无法检测到的死锁(即应用程序挂起)。考虑到解决问题涉及查看流程转储,我想这就是他们所遇到的情况。

  • 因此,只要您仅在READ COMMITTED隔离级别事务中插入日志,就可以保证安全。如果您预期我怀疑存在相同的问题(即涉及应用程序层锁的死锁),那么就没有多少数据库向导可以为您省钱,因为即使您登录单独的事务或进入单独的连接,该问题仍然会显现出来。

    09-11 10:49