Mat*_*tin 9 sql-server logging deadlock audit-tables isolation-level
我正在编写一些将在生产中运行的日志/审计代码(不仅仅是在抛出错误或开发时).在阅读了Coding Horror的死锁和伐木经验后,我决定寻求建议.(杰夫的"不记录"解决方案对我不起作用,这是法律规定的安全审计)
是否有合适的隔离级别可以最大限度地减少争用和死锁?我可以添加到insert语句或存储过程的任何查询提示?
我非常关心除审计表之外的所有事务的事务完整性.我的想法是记录如此多,如果一些条目失败,这不是问题.如果日志记录停止了某个其他事务 - 那将是不好的.
我可以登录到数据库或文件,虽然登录到文件不那么有吸引力,因为我需要能够以某种方式显示结果.记录到文件会(几乎)保证日志记录不会干扰其他代码.
正常事务(即READ COMMITTED)插入已经执行了"最小"锁定.插入密集型应用程序不会在插入时死锁,无论插入如何与其他操作混合.在最坏的情况下,密集插入系统可能会导致发生插入的热点上的页面锁存器争用,但不会导致死锁.
要像Jeff所描述的那样造成死锁,必须有更多的方法,比如以下任何一个:
locklog4net框架中的.Net 语句),导致无法检测到的死锁(即应用程序挂起).鉴于解决问题涉及查看流程转储,我想这就是他们所拥有的方案.因此,只要您只插入READ COMMITTED隔离级别事务的登录,您就是安全的.如果您怀疑我遇到了同样的问题(即涉及应用层锁定的死锁),那么没有多少数据库向导可以保存您,因为即使您登录单独的事务或单独连接,问题仍然可以显现.
如果您不关心日志记录表的一致性,为什么不从单独的线程执行所有日志记录.
我可能不会在记录之前等待事务完成,因为日志对于诊断长时间运行的事务是至关重要的.此外,这使您可以查看回滚的事务所做的所有工作.
在日志记录线程中抓取堆栈跟踪和所有日志记录数据, 在有新的日志消息时将其放入队列,在单个事务中将它们刷新到db.
最小化锁定的步骤:
通过在单个(小型)事务中刷新多个日志消息,您将获得更好的性能,并且具有如果10个线程正在执行工作和记录内容的优点,则只有一个线程正在将内容刷新到日志记录表中.这种流水线实际上使得东西更好.
| 归档时间: |
|
| 查看次数: |
2431 次 |
| 最近记录: |