如何检测 ServicedComponent 中的事务中止?
我正在尝试创建一个 System.EnterpriseServices.ServicedComponent 以便参与分布式事务。我的主要方法如下所示:
public void DoSomething()
{
try
{
// do something useful
// vote for commit
if (ContextUtil.IsInTransaction)
ContextUtil.MyTransactionVote = TransactionVote.Commit;
}
catch
{
// or shoud I use ContextUtil.SetAbort() instead?
if (ContextUtil.IsInTransaction)
ContextUtil.MyTransactionVote = TransactionVote.Abort;
throw;
}
}
我想做的是检测分布式事务是否已中止(或回滚),然后也继续回滚我的更改。例如,我可能在磁盘上创建了一个文件,或者做了一些需要撤消的副作用。
我尝试处理 SystemTransaction.TransactionCompleted 事件或检查 Dispose() 方法中 SystemTransaction 的状态,但没有成功。
我理解这类似于“补偿”而不是“交易”。
我想做的事情有意义吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我建议不要以这种方式管理交易,除非你需要它。
如果您希望您的操作在链中涉及的任何其他操作失败时投票中止,或者在一切顺利时投票赞成提交;只需放置一个
[AutoComplete]
属性(请参阅此 备注部分)。 enterpriseservices.autocompleteattribute%28v=vs.71%29.aspx" rel="nofollow">article) 位于方法声明的上方。这样,如果出现异常,当前事务将被中止,否则将自动完成。
考虑下面的代码(这可能是典型的服务组件类):
I would recommend to not manage the transaction in such way unless you need it.
If you want your operation to vote abort if any of the other operations involved in the chain fail, or vote for commit if everything went fine; just place an
[AutoComplete]
atttribute (see Remarks section at this article) just above your method's declaration.In this way the current transaction will be aborted just in case an exception raises and will be completed otherwise, automatically.
Consider the code below (this could be a typical serviced component class):
回答我自己的问题,这可以通过从 System 派生 ServicedComponent 来实现。 Transactions.IEnlistmentNotification 也是如此。
Answering my own question, this is possible by deriving the ServicedComponent from System.Transactions.IEnlistmentNotification as well.