GVKun编程网logo

LINQ to SQL中的TransactionScope与事务

20

针对LINQtoSQL中的TransactionScope与事务这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.net–TransactionScopevSQLTransaction、.ne

针对LINQ to SQL中的TransactionScope与事务这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.net – TransactionScope v SQLTransaction、.net – 使用Linq-2-Sql时System.Transactions源警告、.net – 在transactionscope中打开sql连接很重要、C# TransactionScope 事务类等相关知识,希望可以帮助到你。

本文目录一览:

LINQ to SQL中的TransactionScope与事务

LINQ to SQL中的TransactionScope与事务

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();    }         }

与TransactionScope对象

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

答案1

小编典典

Linq2SQL将使用隐式事务。如果所有更新都在一个Submit中完成,则您可能不需要自己处理事务。

从文档(重点是我的):

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

.net – TransactionScope v SQLTransaction

.net – TransactionScope v SQLTransaction

我找到了以下引用:“建议您在此网站上使用TransactionScope类创建隐式事务”: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx.TransacrtionScope是否替换了sqlTransaction类?即,所有新的应用程序/事务功能是否应使用TransactionScope类?如果是这种情况,那么我假设sqlTransaction就在那里,以便遗留应用程序不需要更改?

我已阅读过许多网页,建议如果使用多个连接则应使用TransactionScope,但如果您有一个执行多个操作的单元连接应该被视为原子工作单元,那么应该使用TransactionScope吗?

解决方法

我个人喜欢transactionScope,因为您对数据库的查询不需要sqlTransaction(或连接)或其他相关代码的参数来维护事务.这通常允许您的服务/业务层完全管理事务,这对我来说只是更干净.

.net – 使用Linq-2-Sql时System.Transactions源警告

.net – 使用Linq-2-Sql时System.Transactions源警告

我启用了System.Transactions日志记录:
<system.diagnostics>
    <sources>
        <source name="System.Transactions" switchValue="Warning">
            -- my listeners here
        </source>
    </sources>
</system.diagnostics>

并看到很多奇怪的日志警告,如:

> Transaction.Rollback被调用
>征兵回调否定
> TransactionScope不完整

可以请有人对此有所了解吗?我的系统按预期工作,并且没有引发ADO.NET级异常. DAL代码是典型的L2S代码,没有明确的事务管理或任何黑客攻击.

解决方法

使用switchValue of Warning将获取不仅仅是错误.来自msdn:

存在可能随后导致错误或严重故障的情况(例如,分配失败或接近限制).正常处理来自用户代码的错误(例如,事务中止,超时,身份验证失败)也可以生成警告.

也许这就是你想要的.如果是这样,很酷.否则,您可能希望将其更改为“错误”.

.net – 在transactionscope中打开sql连接很重要

.net – 在transactionscope中打开sql连接很重要

我创建了一个sqlconnection,CN1.然后打开CN1.稍后在代码中有一个transactioncope.如果我在这个CN1连接上执行sql命令,这是在事务中吗?

代码看起来像这样;

sqlConnection cn1 = new sqlConnection();
cn1.open(); //connection opened when there is no ambient transaction.
...

using(TransactionScope scope = new TransactionScope())
{
  sqlCommand cmd; //a typical sql command.

  ...

  cmd.ExecuteNonQuery(); //Is this command within transaction?
  ...
}

解决方法

务必在TransactionScope中打开连接,以确保连接在事务中注册.

这可以在连接上方的注释中找到.在this MSDN示例中打开.

C# TransactionScope 事务类

C# TransactionScope 事务类

微软自带的TransactionScope(.Net Framework 2之后)是个好东东,提供的功能也很强大。

  首先说说TransactionScope是什么,并能为我们做什么事情。其实看Transaction(事务)这个单词,我想大家已经能猜到个大概。不同于SqlTransaction的事务,因为现在做的项目都有不同的分层架构,如果不在数据库操作层里面做的话,那么使用TransactionScope是一种理想的方式,它是一个轻量级的事务类。所谓事务,就好比两个串联的开关,控制着一个灯泡,这两个开关可以理解为一个独立的单位,要么都开,否则灯泡就亮不起来。在程序里面就是要么都正常执行,如果中间有异常,事务就会出现回滚操作。回滚操作相当于回到操作之前的状态,可以理解为没有操作。这里面,事务是针对数据库的一种行为。

  要想使用TransactionScope,很方便,只需要在项目中添加System.Transactions.dll引用,然后添加命名空间(using System.Transactions;)即可。

  我们来看看微软的TransactionScope类:

    public sealed class TransactionScope : IDisposable
    {
        public TransactionScope();
        public TransactionScope(Transaction transactionToUse);
        public TransactionScope(TransactionScopeOption scopeOption);
        public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout);
        public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout);
        public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions);
        public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout, EnterpriseServicesInteropOption interopOption);
        public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption);

        public void Complete();
        public void Dispose();
    }

  sealed关键字修饰类,说明该类不能被继承。该类提供多种构造函数及Complete()和Dispose()方法.

  =》Complete()即为提交事件的方法

  =》Dispose()即释放事务对象的方法

  (1)TransactionScopeOption参数,该参数是一个枚举类型:

    public enum TransactionScopeOption
    {

   Required = 0,
   RequiresNew = 1,
   Suppress = 2
    }

  Required=》该范围需要一个事务。 如果已经存在事务,则使用该事务。

        否则,在进入范围之前创建新的事务。 这是默认值。

  RequiresNew=》总是为该范围创建新事务

  Suppress=》事务上下文在创建范围时被取消。 范围中的所有操作都在无事务上下文的情况下完成。

  通过查看 System.Transactions.Transaction.Current 属性。如果这个属性为“null”,说明不存在当前事务。

  (2)TransactionOptions参数,包含指定事务行为的附加信息。

 public struct TransactionOptions
    {

    。。。。。。

        public IsolationLevel IsolationLevel { get; set; }
        public TimeSpan Timeout { get; set; }
    }

  如果要修改 TransactionScope 的默认设置,可以实例化TransactionOptions对象,并对该对象传递需要的参数。可以通过它在 TransactionScope 对象上设置隔离级别和事务的超时时间。

  IsolationLevel=》设置隔离级别

 Serializable           可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。 
 RepeatableRead    可以在事务期间读取可变数据,但是不可以修改。 可以在事务期间添加新数据。  
 ReadCommitted    不可以在事务期间读取可变数据,但是可以修改它。 
 ReadUncommitted 可以在事务期间读取和修改可变数据。 
 Snapshot             可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值。在尝试提升以此隔离级别创建的事务时,将引发一个InvalidOperationException,并产生错误信息“Transactions with IsolationLevel Snapshot cannot be promoted”(无法提升具有 IsolationLevel 快照的事务)。
 Chaos 无法覆盖隔离级别更高的事务中的挂起的更改。 
 Unspecified 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。如果设置了此值,则会引发异常。   

  Timeout=》设置事务的超时时间(默认设置为 1 分钟)

 TimeSpan(Int64)                                        将新的 TimeSpan 初始化为指定的刻度数。 
 TimeSpan(Int32, Int32, Int32)                     将新的 TimeSpan 初始化为指定的小时数、分钟数和秒数。 
 TimeSpan(Int32, Int32, Int32, Int32)            将新的 TimeSpan 初始化为指定的天数、小时数、分钟数和秒数。 
 TimeSpan(Int32, Int32, Int32, Int32, Int32)   将新的 TimeSpan 初始化为指定的天数、小时数、分钟数、秒数和毫秒数。

  (3)下面举一个例子说明怎么使用,主要看红色部分的代码,红色部分代码即为使用TransactionScope的例子。用很少的几行代码就可以实现轻量级TransactionScope事务。


        public bool FixProjectSorceInsert()
        {
            bool result = true;
            TransactionOptions transactionOption = new TransactionOptions();
            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 设置事务超时时间为120秒
            transactionOption.Timeout = new TimeSpan(0, 0, 120);

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                try
                {
                    Insert();

       Update();

       Delete();

                    // 没有错误,提交事务
                    scope.Complete();
                }
                catch (Exception ex)
                {
                    throw new Exception("发送信息异常,原因:" + ex.Message);
                    result = false;
                }
                finally
                {
                    //释放资源
                    scope.Dispose();
                }

            }
            return result;
        }

  (4)小结:使用事务,就像使用一把锁,会锁定资源。资源总是有限,所以进入和退出事务都要控制在较短的时间。在需要使用事务前创建它,在需要执行时打开连接,并尽快完成释放事务。而且在事务执行中,尽可能避免执行不必要或与数据库操作无关的代码,因为这能够防止资源被过度锁定。

 

关于LINQ to SQL中的TransactionScope与事务的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.net – TransactionScope v SQLTransaction、.net – 使用Linq-2-Sql时System.Transactions源警告、.net – 在transactionscope中打开sql连接很重要、C# TransactionScope 事务类等相关内容,可以在本站寻找。

本文标签: