当TransactionScope和嵌套事务都不受支持时该怎么办?

时间:2010-10-03 23:14:02

标签: c# .net database transactionscope nested-transactions

TransactionScope是一个了不起的功能,但很少有提供商能够正确实现它。 我不想将连接作为参数传递。

2 个答案:

答案 0 :(得分:1)

不确定你想在这里使用TransactionScope实现什么 - 如果想要在方法之间拥有自动事务流(并且在正在进行的事务中简单登记),那么将连接作为参数传递并不是唯一的方法。您可以使用当前CallContext(或当前线程)传递当前连接和事务。放一个简单的静态包装器,检查当前调用上下文中是否存在连接/事务,如果不存在则创建。这是透明的非侵入式方式,而不是通过参数传递。

现在,如果您正在查看跨应用域边界和/或使用多个资源管理器(即使用分布式事务)的流量事务,那么最好的选择是使用TransactionScope并推出your own ResourceManager。当然,这不是一件小事,但那就是要求所需要的。如果底层系统不提供事务资源,则自定义资源管理器可以使用补偿事务进行回滚(例如,文件系统顶部的管理器可以使用“删除文件夹”作为对“创建文件夹”的原始事务的补偿事务)

答案 1 :(得分:0)

也许您正在寻找System Prevalence

基本上,每个事务都是journaled(事务的详细信息已保存),如果应用程序崩溃并重新启动,您可以选择停止的位置或根据日志状态回滚更改。 / p>

以下是Snapshot pattern的链接,可以帮助您实现系统普遍性。