English 中文(简体)
事务范围
原标题:
  • 时间:2009-01-06 23:24:04
  •  标签:

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

我主要是VB.NET开发者,但如果你使用C#编写我也能阅读。

如果以上内容太模糊:

我理解 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的上下文。我希望能够使用自己的库来设置这个。

问题回答

我建议阅读Juval Lowy所著的文章介绍System.Transactions,链接为http://msdn.microsoft.com/en-us/library/ms973865.aspx。

我会试着回答,但我不完全确定问题是什么。

在数据库方面,交易往往具有范围。这表示正在被更改的数据量的覆盖范围。它们在数据库服务器中实现,无法在代码中更改。每个数据库服务器都将拥有自己的实现,每个服务器(Oracle、MSSQL、MySQL)将拥有它们自己的行为。

通常,一项交易将锁定正在修改的数据,阻止其他连接从中读取。交易的范围将尽可能小,随着更改数据的数量增加而扩大。数据库最好尽可能锁定少量数据,它通过以下方式实现:

  • Locking a single column in a single row of data
  • then locking a single row of data
  • then locking a page of data (8096 bytes perhaps?)
  • then locking an entire table of data

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

基本上,协议是您无法修改服务器实现的方式,交易范围也不是您需要过多担心的事情。只需确保交易仅用于互相依赖的简洁更新。我通常不使用交易。但是,我不与银行账户或其他参考关键系统合作。

希望这能有所帮助!

你的问题相当模糊,很难知道你实际在询问什么并寻求什么答案,但或许这可以帮到你?

将此翻译为中文:http://www.codeproject.com/KB/dotnet/TransactionScope20.aspx http://www.codeproject.com/KB/dotnet/TransactionScope20.aspx

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

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

[ThreadStatic]
private static Context scopeContextThingy;

每个线程将只有一个scopeContextThingy。 如果scopeContextThingy == null,则您是父级,应创建新上下文。 否则,您是嵌套的范围。





相关问题
热门标签