交易范围 +审核表 +在存储过程中提交事务
我的公司正在使用 SQL Server 2008。我面临着一个存在事务问题的审计表。
我有一个存储过程。
create proc MySP
as begin
insert into MY_TABLE values('Value1');
begin transaction TX_MY_SP
-- write to audit table permanently
insert into AUDIT_TABLE values('Value1 is inserted.');
commit transaction TX_MY_SP
end
我有一段 VB.net 代码
Using tx = New TransactionScope()
Using conn = New SqlConnection(MY_CONN_STR)
Using cmd = New SqlCommand("MySP", conn)
conn.Open()
cmd.ExecuteNonQuery()
Throw New ApplicationException("Always throw exception.")
End Using
End Using
tx.Complete()
End Using
,但是没有记录插入到 AUDIT_TABLE 中。我在MSDN http://msdn.microsoft.com/en-us 中找到了原因/library/ms189336.aspx
我的问题是如何使用存储过程插入记录 AUDIT_TABLE 。
谢谢!
My company is using SQL Server 2008. I am facing a Audit Table with transaction problems.
I have a stored procedure.
create proc MySP
as begin
insert into MY_TABLE values('Value1');
begin transaction TX_MY_SP
-- write to audit table permanently
insert into AUDIT_TABLE values('Value1 is inserted.');
commit transaction TX_MY_SP
end
I have a block of VB.net code
Using tx = New TransactionScope()
Using conn = New SqlConnection(MY_CONN_STR)
Using cmd = New SqlCommand("MySP", conn)
conn.Open()
cmd.ExecuteNonQuery()
Throw New ApplicationException("Always throw exception.")
End Using
End Using
tx.Complete()
End Using
However there is no record inserted into AUDIT_TABLE. I found the reason in MSDN http://msdn.microsoft.com/en-us/library/ms189336.aspx
My question is how can I insert records AUDIT_TABLE with stored procedure.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
基本上,您可以做的就是拥有一个异步审核/日志系统。
因此,您的审计将在不同的线程上运行,并且主事务范围是否失败并不重要。
Basically, what you can do is to have one async audit/log system.
So your audit will be running on a different thread, and it does not matter whether you main transaction scope fails or not.
事务内任何回滚的操作也会回滚。不这样做会破坏事务原子性。鉴于您正在审核的活动正在被回滚,您很可能实际上希望审核被回滚。
尽管如此,在某些合法情况下,需要在当前事务范围之外记录操作,例如某些调试情况。有一些已知的解决方法,例如对 用户可配置事件类,然后使用
sp_trace_generateevent
引发事件通知 激活程序来运行和记录审核。由于探查器事件是在事务范围之外生成的,因此审计记录不会回滚。Any operation inside a transaction that rolled back rolls back as well. Not doing so would break transaction atomicity. Given that the activity you're auditing is being rolled back, is very likely that you actually want the audit to be rolled back anyway.
None the less, there are legitimate cases when one needs to have operations recorded outside the scope of the current transaction, like certain debug cases. There are known workarounds, like using event notifications for the user configurable event class, then using
sp_trace_generateevent
to cause the event notification activated procedure to run and record the audit. Because the profiler events are generated outside the transaction scope, the audit record does not get rolled back.当您使用
TransactionScope
时,您需要调用Complete
方法:When you use
TransactionScope
, you need to call theComplete
method before going out of its scope if you don't want the transaction to rollback: