当前位置:  开发笔记 > 编程语言 > 正文

在LINQ to SQL中的TransactionScope与事务

如何解决《在LINQtoSQL中的TransactionScope与事务》经验,为你挑选了4个好方法。

LINQ to SQL中的经典事务模式有什么区别:

using(var context = Domain.Instance.GetContext())
{
    try
    {
        context.Connection.Open();
        context.Transaction = context.Connection.BeginTransaction();
        /*code*/
        context.Transaction.Commit();
    }
    catch
    {
        context.Transaction.Rollback();
    }         
}

vs TransactionScope对象

using (var context = Domain.Instance.GetContext())
using (var scope = new TransactionScope())
{
    try
    {
        /*code*/
        scope.Complete();
    }
    catch
    {
    }
}

casperOne.. 76

应该注意的是,在使用时,您TransactionScope不需要try/catch构造.您只需调用Complete范围,以便在退出范围时提交事务.

话虽如此,TransactionScope通常是一个更好的选择,因为它允许您将调用嵌套到可能需要事务的其他方法,而无需传递事务状态.

当调用BeginTransaction上的DbConnection对象,你必须通过,如果你想在同一个事务执行其他操作围绕该交易对象,但在不同的方法.

使用TransactionScope,只要范围存在,它将处理Transaction在线程上注册当前内容的所有内容,使代码更清晰,更易于维护.

最重要的是,您可以使用其他可以参与事务的资源,而不仅仅是与数据库的连接.

应该注意的是,在您需要充分利用连接和数据库操作的情况下,您可能不想使用TransactionScope; 即使针对单个数据库,您也可以使用分布式事务处理协调器,并将事务转换为分布式事务(即使对于单个数据库连接).

在这些情况下,在弄乱您的设计时,您可能需要考虑传递特定于连接的事务.

或者,如果您知道将始终使用一个资源(并且在同一个线程上),则可能需要创建一个引用计数连接/事务的类.

您将创建一个在构造时创建资源/增加计数的类.它还将实现IDisposable(当计数为零时,您将减少/释放/提交/中止),并将计数存储在已ThreadStaticAttribute应用于它的变量中.

这允许您将事务管理与逻辑代码分开,并且仍然可以相当有效地保留单个资源(而不是升级到分布式事务).



1> casperOne..:

应该注意的是,在使用时,您TransactionScope不需要try/catch构造.您只需调用Complete范围,以便在退出范围时提交事务.

话虽如此,TransactionScope通常是一个更好的选择,因为它允许您将调用嵌套到可能需要事务的其他方法,而无需传递事务状态.

当调用BeginTransaction上的DbConnection对象,你必须通过,如果你想在同一个事务执行其他操作围绕该交易对象,但在不同的方法.

使用TransactionScope,只要范围存在,它将处理Transaction在线程上注册当前内容的所有内容,使代码更清晰,更易于维护.

最重要的是,您可以使用其他可以参与事务的资源,而不仅仅是与数据库的连接.

应该注意的是,在您需要充分利用连接和数据库操作的情况下,您可能不想使用TransactionScope; 即使针对单个数据库,您也可以使用分布式事务处理协调器,并将事务转换为分布式事务(即使对于单个数据库连接).

在这些情况下,在弄乱您的设计时,您可能需要考虑传递特定于连接的事务.

或者,如果您知道将始终使用一个资源(并且在同一个线程上),则可能需要创建一个引用计数连接/事务的类.

您将创建一个在构造时创建资源/增加计数的类.它还将实现IDisposable(当计数为零时,您将减少/释放/提交/中止),并将计数存储在已ThreadStaticAttribute应用于它的变量中.

这允许您将事务管理与逻辑代码分开,并且仍然可以相当有效地保留单个资源(而不是升级到分布式事务).


@Parhs与数据库提供程序无关,但是您可以具有事务性文件系统,事务性Web服务等。如果这些内容包含在具有单个数据库连接的事务中,则DTC会介入。

2> TGnat..:

Linq2SQL将使用隐式事务.如果您的所有更新都在一次提交中完成,则您可能不需要自己处理该事务.

从文档(强调我的):

当您调用SubmitChanges时,LINQ to SQL会检查调用是否在Transaction的范围内,或者Transaction属性(IDbTransaction)是否设置为用户启动的本地事务.如果它找不到任何事务,LINQ to SQL将启动本地事务(IDbTransaction)并使用它来执行生成的SQL命令.成功完成所有SQL命令后,LINQ to SQL将提交本地事务并返回.


如果您需要提交具有循环属性(常见)的内容,则会遇到LINQ to SQL中的错误,该错误要求您删除每个双向引用的一部分,提交,修复双向引用,然后再次提交.您需要将所有这些包装在您自己的事务中才能这样做.这是一个普遍的需求,所以"别担心它"并不是最好的答案.

3> Mayank..:

一个很大的区别(经验教训) - TransactionScope使用MS DTC进行事务管理.

如果您的应用程序必须仅管理数据库事务,并且不涉及任何服务或远程调用,则可以通过使用数据库本机事务(DbTransactions)跳过与MS DTC相关的潜在问题.


这并不是一直都是如此.`TransactionScope`将根据需要从内核事务升级到DTC事务.但是,这一切对你来说都是隐藏的.重要的一点是它不会*总是*这样做,但*根据需要*.

4> 小智..:

TransactionScope为所有资源管理器(SQL服务器,活动目录,文件系统......)提供统一管理.此外,人们可以编写自己的资源管理器:检测事务范围的代码,加入它并完全像SQL服务器那样工作:像事务的其他参与者一样提交或恢复更改.我认为TransactionScope是主流并忘记了MS SQL本机事务,直到失败进入巨大的陷阱: Windows Server 2008 WEB Edition附带受限制的分布式事务协调器服务,而事务范围仅适用于单台计算机. 如果IIS和SQL Server安装在不同的计算机上,则ASP.NET应用程序将在此系统上失败.考虑到大多数公共域提供商提供Windows Server WEB版和SQL服务器都在不同的服务器上.这意味着,您必须使用显式事务管理来处理本机事务...

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有