如何创建一个可以与TransactionScope一起使用的类?

30

我想知道,如果我想创建一个类来执行某些操作,并且我希望它能够在TransactionScope中使用,我需要实现什么?

也就是说:我的类需要知道它在事务中,但是它如何在提交或回滚时得到通知?在回滚时,我该如何实际回滚?

我认为我的类会有像“添加”、“更新”和“删除”之类的方法,这些方法只修改一个临时更改列表,并且一个名为“读取”的方法需要检测是否在事务中并相应地返回修改或未修改的数据,但是然后我需要一个被调用的Commit/Rollback方法吗?

我应该订阅Transaction.TransactionCompleted事件吗?如果是,我如何避免对同一事务进行多次订阅?

我注意到事务没有ID,有没有办法管理/处理多个并发事务或嵌套事务?

MSDN文档System.Transactions有很多内容,但似乎是面向消费者而不是实现者的,因此我想知道是否有人有关于服务如何为事务提供支持的良好来源(无论是在Web上还是书籍中)?

假设我的类没有已支持事务并能够“直通”的基础存储。假设我的类看起来像这样:

public class MyClass {
    private List<MyObject> _businessData;

    public void Create(Myobject data) { ... }
    public MyObject Read(string query) { ... }
    public void Update(Myobject data) { ... }
    public void Delete(Myobject data) { ... }
}
1个回答

17

这篇文章提供了很好的概述,讲述了需要什么。虽然有些旧,但我认为其中提到的内容仍然适用。

总结一下文章,您需要在Transaction类上调用Enlist方法之一,并传递实现IEnlistmentNotification的对象。


如果有人想知道,那是通过谷歌搜索“参与System.Transaction”得到的第四个链接。 - Peter T. LaComb Jr.
1
谢谢。这篇文章是一个很好的概述,但不是非常深入(例如,如果我支持多个并发事务,如何知道哪个事务正在提交)。但是“资源管理器”作为关键词帮助我找到了像http://msdn.microsoft.com/en-us/magazine/cc163688.aspx这样填补空白的文章。 - Michael Stum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接