1

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

我主要是 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 的上下文。我希望能够使用我自己的库进行设置。

4

5 回答 5

7

我推荐 Juval Lowy 的文章Introducing System.Transactions

于 2009-01-07T02:01:23.097 回答
0

我会试一试,但我不是 100% 确定这个问题。

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

通常,事务将锁定任何其他连接,使其无法读取它正在修改的数据。事务的范围将开始尽可能小,然后随着被更改数据量的增长而扩大。锁定尽可能少的数据符合数据库的最大利益,它通过以下方式做到这一点:

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

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

基本上,交易是您无法修改服务器的实现方式,并且事务范围不是您应该过多担心的事情。只需确保仅围绕相互依赖的简洁更新使用事务。我通常不使用事务。但话又说回来,我没有使用银行账户或任何其他参考关键系统。

希望这可以帮助!

于 2009-01-06T23:37:07.520 回答
0

您的问题非常含糊,因此很难知道您实际上在问什么并寻求答案,但这也许会有所帮助?

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

于 2009-01-06T23:50:50.020 回答
0

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

于 2009-01-08T05:25:56.803 回答
0

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

[ThreadStatic]
private static Context scopeContextThingy;

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

于 2009-01-08T05:51:33.130 回答