作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 SQL Server T-SQL 中有存储过程,这些过程是在事务范围内从 .NET 调用的。
在我的存储过程中,我正在对一些审核表进行一些日志记录。我在审计表中插入一行,然后在事务中通过更新的方式填充更多信息。
我发现,如果几个人同时尝试同一件事,其中一两个人将成为事务死锁的受害者。目前,我假设当我插入审计表时发生某种锁定。
我想在我正在执行的事务之外执行对审计表的插入和更新,这样即使事务回滚,审计仍然会发生。我希望这可以阻止任何锁定的发生,从而允许多个人同时执行该过程。
任何人都可以帮我在 T-SQL 中做到这一点吗?
谢谢,丰富
更新 - 由于 Josh 建议使用 SQL Profiler 来追踪死锁的根源,我发现审核与事务死锁无关。
最佳答案
TranactionScope 支持抑制:
using (TransactionScope scope = new TransactionScope())
{
// Transactional code...
// Call a SQL stored procedure (but suppress the transaction)
using (TransactionScope suppress = new TransactionScope(TransactionScopeOption.Suppress))
{
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open();
SqlCommand sqlCommand = conn.CreateCommand();
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = "MyStoredProcedure";
int rows = (int)sqlCommand.ExecuteScalar();
}
}
scope.Complete();
}
但我不得不质疑为什么日志记录/审计会在事务之外运行?如果事务回滚,您仍然会拥有已提交的审核/日志记录,但这可能不是您想要的。
您没有提供太多有关如何记录的信息。您的审计表是否有外键指向您的主要事件表?如果是这样,请删除外键(假设审核记录仅来自“已知”应用程序)。
关于sql-server - 如何在 T-SQL 事务外执行插入和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483402/
我是一名优秀的程序员,十分优秀!