• Linq to sql(七):并发与事务(三)


    事务处理

           Linq to sql在提交更新的时候默认会创建事务,一部分修改发生错误的话其它修改也不会生效:

            ctx.Customers.Add(new Customer { CustomerID = "abcdf", CompanyName = "zhuye" });

            ctx.Customers.Add(new Customer { CustomerID = "abcde", CompanyName = "zhuye" });

            ctx.SubmitChanges();

           假设数据库中已经存在顾客ID为“abcde”的记录,那么第二次插入操作失败将会导致第一次的插入操作失效。

    执行程序后会得到一个异常,查询数据库发现“abcdf”这个顾客也没有插入到数据库中。

           如果每次更新后直接提交修改,那么我们可以使用下面的方式做事务:

            if (ctx.Connection != null) ctx.Connection.Open();

            DbTransaction tran = ctx.Connection.BeginTransaction();

            ctx.Transaction = tran;

            try

            {

                CreateCustomer(new Customer { CustomerID = "abcdf", CompanyName = "zhuye" });

                CreateCustomer(new Customer { CustomerID = "abcde", CompanyName = "zhuye" });

                tran.Commit();

            }

            catch

            {

                tran.Rollback();

            }

     

        private void CreateCustomer(Customer c)

        {

            ctx.Customers.Add(c);

            ctx.SubmitChanges();

        }

           运行程序后发现增加顾客abcdf的操作并没有成功。或者,我们还可以通过TransactionScope实现事务:

            using (TransactionScope scope = new TransactionScope())

            {

                CreateCustomer(new Customer { CustomerID = "abcdf", CompanyName = "zhuye" });

                CreateCustomer(new Customer { CustomerID = "abcde", CompanyName = "zhuye" });

                scope.Complete();

            }

  • 相关阅读:
    在linux上开发210的hdmi-servers输出
    haproxy.cfg
    【Quartz】Quartz的搭建、应用(单独使用Quartz)
    application.xml定时
    URLEncode转json
    Callable与Future的简单介绍
    Java并发:Callable、Future和FutureTask
    Java并发编程:Callable、Future和FutureTask
    EXECUTORSERVICE线程池讲解
    ExecutorService中submit和execute的区别
  • 原文地址:https://www.cnblogs.com/kevin2013/p/1749048.html
Copyright © 2020-2023  润新知