交易范围

时间:2009-01-06 23:24:05

标签: transactions msdtc system.transactions transactionscope

交易范围如何运作?它是如何知道何时已经使用了另一个上下文,以及如何在我的代码中实现另一种范围。

我主要是一名vb.net开发人员,但是如果你写的话,我可以阅读c#。

如果上述情况过于模糊:

我了解system.transactions的作用以及如何使用它。我想知道的是如何创建类似的东西,我自己的库,我可以包装一些代码,可以像system.transactions范围一样处理它。我打算在缓存模型中使用它,它会大大增强它。我正在寻找有关事务范围如何知道的详细信息,例如存在父范围,因此它可以附加到它等等,或者提交然后需要在更高级别或更高级别的联系中进行。

例如,如果我有以下

using scope1 as new system.transactions.scope
    using scope2 as new system.transactions.scope
        using scope3 as new system.transactions.scope
             scope3.commit
        end using
        scope2.commit
    end using
end using

Scope1不会提交,因此scope2或scope3也不会提交,因为它们的父级都是scope1的上下文。我希望能够用我自己的库来设置它。

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:0)

我会采取刺,但我不能100%肯定这个问题。

就数据库而言,交易往往具有范围。这表示覆盖了事务中正在更改的数据量。它们在数据库服务器中实现,不能在“代码”中更改。每个数据库服务器都有自己的实现,每个服务器(oracle,MSSQL,MySQL)都有自己的行为。

通常,事务会锁定任何其他连接,使其无法读取正在修改的数据。事务的范围将尽可能小,然后随着更改的数据量的增加而扩展。锁定尽可能少的数据符合数据库的最佳利益,它通过以下方式实现:

  • 锁定单行数据中的单个列
  • 然后锁定单行数据
  • 然后锁定一页数据(可能是8096字节?)
  • 然后锁定整个数据表

如果您的更新修改了多行数据,则事务范围将扩展为页面大小(每个服务器的自定义),或锁定整个表。某些数据库服务器将允许其他连接在事务正在进行时更新之前读取表,而其他数据库服务器将阻止对数据的任何选择,直到提交事务为止。

基本上,交易是您无法修改服务器的实施方式,而且您不应过分担心交易范围。只是确保只使用相互依赖的简洁更新的事务。我通常不使用交易。但话说回来,我不是在处理银行账户或任何其他引用关键的系统。

希望这有帮助!

答案 2 :(得分:0)

你的问题很模糊,很难知道你实际上在询问什么,并寻求答案,但也许这会有所帮助?

http://www.codeproject.com/KB/dotnet/TransactionScope20.aspx

答案 3 :(得分:0)

我认为我找到了重现范围行为的解决方案。我将很快发布信息,但基本上它涉及使用静态值实现idisposable来跟踪对象的嵌套实例。为了将它连接到缓存提供程序,我计划使用缓存对象的数组列表,然后在处理对象时运行某种清理。我认为我也知道如何处理线程问题,但我仍然在处理物流。当我完成后,我将发布代码,以便可以在速度之上部署代码,以便处理我所面临的一些当前挑战。

答案 4 :(得分:0)

我不知道System.Transactions如何在内部工作,但你可以使用线程本地内存来实现这一点。在.NET中,ThreadStatic属性将为您提供此功能。在这样的地方声明你的范围上下文:

[ThreadStatic]
private static Context scopeContextThingy;

每个线程只有一个scopeContextThingy。然后,如果scopeContextThingy == null,您就是父母,应该创建一个新的上下文。否则,你就是一个嵌套的范围。