【问题标题】:What to do when neither TransactionScope nor nested transactions are supported?当 TransactionScope 和嵌套事务都不支持时怎么办?
【发布时间】:2010-10-03 23:14:01
【问题描述】:

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

【问题讨论】:

  • @Preet Sangha:MySql 不支持同一事务中的多个连接。 SQL Server 2005 错误地提升为 MSDTC。 Oracle 有时会显示一些错误。

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


【解决方案1】:

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

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

【讨论】:

  • 我在考虑使用 ThreadStatic 变量,但 CallContext 正是我所需要的!非常感谢 VinayC。
【解决方案2】:

也许你正在寻找System Prevalence

基本上,每个事务都是journaled(保存事务的详细信息),如果应用程序崩溃并重新启动,您可以从上次中断的地方继续,或者根据日志状态回滚更改。

这是一个指向Snapshot pattern 的链接,它可以帮助您实施 System Prevalence。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多