【问题标题】:finding the parent transaction scope's TransactionScopeOption in the child transactionscope在子事务作用域中查找父事务作用域的 TransactionScopeOption
【发布时间】:2011-06-01 05:46:16
【问题描述】:

在父事务范围内,我有必需的 TransactionScopeOption。

稍后在内部事务范围内,我需要检查父事务范围的 TransactionScopeOption。

这怎么可能..

例子

Parent : using (TransactionScope transactionScopeParent = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
....
method()
}

method()
{
here i need to check the TransactionScopeOption of this transaction scope's parent one and then set this transaction scope to be having the same TransactionScopeOption.

using (TransactionScope transactionScopeChild = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
}

这可能吗?

【问题讨论】:

    标签: transactionscope


    【解决方案1】:

    这不是必需的。

    如果“父”TransactionScopeRequired,则嵌套的将已注册它的事务。

    如果不是,嵌套的将不会自动变为“必需”。

    唯一的例外是如果您将嵌套的TransactionScope 显式设置为RequiresNew,则新事务将开始。

    【讨论】:

    • 请注意,我的用法是默认情况下,内部事务的 TransactionScope 为 suppress,但是当有父事务范围时,我需要将这个 suppress 更改为内联与父事务范围。请确认
    • @saravanan - 如果你抑制内部事务,它将不参与事务。也许您应该创建两个版本的函数 - 一个抑制事务,一个不。
    • 我实际上必须将此功能用于 MySQL 和 SQL 事务。在 SQL 的情况下,我将允许子事务参与父事务。在 MySQL 的情况下,它将处于抑制事务中,因为 MySQL 不支持分布式事务。
    【解决方案2】:

    从您的 cmets 到 @Oded 的回答来看,您似乎想要

    • MS SQL 连接参与System.Transactions.Transactions
    • MySQL 连接不参与

    要获得这种行为,您只需要追加

    自动登记=假;

    致您的MySQL connection string

    如果AutoEnlist 设置为true(这是默认设置),则连接 使用TransactionScope 打开参与此范围,它提交 当TransactionScope 没有提交和回滚时 犯罪。但是,此功能被认为是安全敏感的,并且 因此不能在中等信任环境中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多