zoukankan      html  css  js  c++  java
  • c# 事务随笔

    曾几何时,为如何操作事务激动个半天。

    曾几何时,还写着这样的事务得意洋洋!

    string connStr=@"Data Source=.\sqlexpress;Initial Catalog=DbTest;Integrated Security=True";
                using(SqlConnection conn=new SqlConnection(connStr))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = conn.CreateCommand();
                        cmd.Transaction = trans;
                        try
                        {
                            //操作1
                            cmd.CommandText = "insert into test1(id) values('aa')";
                            cmd.ExecuteNonQuery();
    
                            //操作2
                            cmd.CommandText = "insert into test1(id) values('01234567890')";//该句出错,id类型为varchar(10)
                            cmd.ExecuteNonQuery();
    
                            trans.Commit();
                            Console.WriteLine("提交!!");
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine(e.Message);
                            trans.Rollback();
                            Console.WriteLine("回滚!!");
                        }
                    }
                    Console.ReadLine();
                }
    
    附上只有一个字段的Test1表:
    ID varchar(10) 主键
    
    

    而后,又发现了Linq to Sql 这个好东西,它是一个轻量级级的ORM,功能非常强大,而且自带事务集成功能。简单的Linq参考资料

    我们同样操作上面一个过程,使用Linq如下

    1.新建一个 Linq to Sql 类,命名为DataClasses1.dbml,再通过‘服务器资源管理器’ 把数据库中的表添加到设计画面。

    2.事务操作如下。

                DataClasses1DataContext db = new DataClasses1DataContext();
    
                try
                {
                    //插入一条ID=1的Test1 的实体。
                    db.Test1.InsertOnSubmit(new Test1() { ID = "1" });
    
                    //插入一条超出限定长度的数据,让它报错
                    db.Test1.InsertOnSubmit(new Test1() { ID = "01234567890" });
    
                    //提交
                    db.SubmitChanges();
                }
                catch { }
    

    很明显,提交的时候由于存在第二条错误语句,提交失败,第一条语句也被回滚。他的操作时如此简单,而且我们也不必再头疼ORM模型,不必再去写那么原始又容易忘记的事务了。那它是不是完美了呢?

    其实不是,我们可以想象一下,如果是一个跨数据库的事务操作呢,显然单单使用Linq是无法解决的。而且,Linq还没成熟,对于不同的数据库,会产生操作的不一致,类似于浏览器的兼容性问题。但Linq真的很强大,不影响其神一般的存在。

    最近,对于事务有发现一个 TransactionScope 类,TransactionScope就像一块魔镜,你只要对着他喊:神啊,赐予我事务!你就真的得到了事务。

    操作如下:

                using (TransactionScope scope = new TransactionScope())
                { 
                    //操作1,数据库1操作
    
                    //操作2,数据库2操作
    
                    //操作3
                    scope.Complete();
                }
    

    对于Scope.Complete()之前的任何操作异常,所有操作都会回滚(不管它属于哪个数据库,服务器)。

    如此强大的功能,说他为魔镜一点也不为过!

  • 相关阅读:
    为VMware虚拟机内安装的Ubuntu 16.04设置静态IP地址
    WPF入门教程系列二十三——DataGrid示例(三)
    WPF入门教程系列二十一——DataGrid示例(二)
    Google Nexus 5X刷机并root
    web调用摄像头拍照
    导出SQL SERVER 数据字典语句
    树莓派安装.Net Core3.1
    使用Open Live Writer写博客
    EFCore的外键级联删除导致的【可能会导致循环或多重级联路径】
    重新装Mysql数据的恢复办法,还原data文件夹下数据库
  • 原文地址:https://www.cnblogs.com/xinjian/p/1774033.html
Copyright © 2011-2022 走看看