欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > > 编程问答 >内容正文

编程问答

分布式事物嵌套事物 -凯发k8官方网

发布时间:2025/1/21 编程问答 8 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 分布式事物嵌套事物 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 transactionscope 是的.net framework2.0版本中增加的一个新命名空间。他的用途是为数据库访问提供一个“轻量级”的事物。使用之前必须添加对 system.transactions.dll 的引用。先介绍介绍几个简单的参数。

 

transactionscopeoptions描述
required如果已经存在一个事务,那么这个事务范围将加入已有的事务。否则,它将创建自己的事务。
requiresnew这个事务范围将创建自己的事务。
suppress如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。当部分代码需要留在事务外部时,可以使用该选项。

您可以在代码的任何位置上随是查看是否存在事务范围,具体方法就是查看 system.transactions.transaction.current 属性。如果这个属性为“null”,说明不存在当前事务。
       若要更改 transactionscope 类的默认设置,您可以创建一个 transactionoptions 对象,然后通过它在 transactionscope 对象上设置隔离级别和事务的超时时间。transactionoptions 类有一个 isolationlevel 属性,通过这个属性可以更改隔离级别,例如从默认的可序列化 (serializable) 改为readcommitted,甚至可以改为 sql server 2005 引入的新的快照 (snapshot) 级别。(请记住,隔离级别仅仅是一个建议。大多数数据库引擎会试着使用建议的隔离级别,但也可能选择其他级别。)此 外,transactionoptions 类还有一个 timeout 属性,这个属性可以用来更改超时时间(默认设置为 1 分钟)。
transactionoptions opt= new transactionoptions();
//设置transactionoptions

opt.isolationlevel = isolationlevel.readcommitted;
// 设置超时间隔为2分钟,默认为60秒
opt.timeout = new timespan(0, 2, 0);

使用时候将

using (transactionscope scope = new transactionscope(transactionscopeoption.requiresnew, opt))

其他和默认一样

下面做一个简单的demo 只需要添加很少的几行代码,这个模型可以对异常进行处理,执行结束后会自行清理,此外,它还可以对命令的提交或回滚进行管理

1.transactionscope  在一个事务范围内

在app.config中

 


   
   
   
   


 

 

 

 static void main(string[] args)
        {
           string constr = configurationmanager.connectionstrings["mycon"].connectionstring;
            string constr2 = configurationmanager.connectionstrings["mycon2"].connectionstring;
            string sql = "insert into [tuser](username,pwd,age) values('新闻socpe测试','bbb',10)";
            #region 不同库的事务
            using (transactionscope sope = new transactionscope())
            {

                 using(sqlconnection con =new sqlconnection(constr))
                {
                    using (sqlcommand cmd = new sqlcommand(sql, con))
                    {
                        con.open();
                      int a=  cmd.executenonquery();
                      console.writeline(a);
                   
                    }
                  
               
                }
                using (sqlconnection con = new sqlconnection(constr2))
                {
                    using (sqlcommand cmd = new sqlcommand(sql, con))
                    {
                        con.open();
                        int b = cmd.executenonquery();
                        console.writeline(b);

                    }


                }

                addotheruser();
                sope.complete();

 

            }
            #endregion

    sope.complete(); 是个标示。只有全部运行才提交事务

2.嵌套 调用事务

 

        static void main(string[] args)
        {


            string constr = configurationmanager.connectionstrings["mycon"].connectionstring;
            string constr2 = configurationmanager.connectionstrings["mycon2"].connectionstring;
            string sql = "insert into [tuser](username,pwd,age) values('新闻socpe测试','bbb',10)";
            #region 不同库的事务
            using (transactionscope sope = new transactionscope(transactionscopeoption.required))
            {

            
                using(sqlconnection con =new sqlconnection(constr))
                {
                    using (sqlcommand cmd = new sqlcommand(sql, con))
                    {
                        con.open();
                      int a=  cmd.executenonquery();
                      console.writeline(a);
                   
                    }
                  
               
                }
                using (sqlconnection con = new sqlconnection(constr2))
                {
                    using (sqlcommand cmd = new sqlcommand(sql, con))
                    {
                        con.open();
                        int b = cmd.executenonquery();
                        console.writeline(b);

                    }


                }

                addotheruser();
                sope.complete();

 

            }
            #endregion

 

 

 


        }

        private static void addotheruser()
        {
            string constr3 = configurationmanager.connectionstrings["mycon3"].connectionstring;
            string constr4 = configurationmanager.connectionstrings["mycon4"].connectionstring;
            string sql1 = "insert into [hr_user](username,password) values('新闻socpe测试','bbb')";
            string sql2 = "insert into [users](username,userpwd) values('新闻socpe测试','bbb')";

            //requiresnew 这个事务范围将创建自己的事务。
            using(transactionscope sope=new transactionscope(transactionscopeoption.requiresnew))
            {

                using (sqlconnection con = new sqlconnection(constr3))
                {
                    using (sqlcommand cmd = new sqlcommand(sql1, con))
                    {
                        con.open();
                        int a = cmd.executenonquery();
                        console.writeline(a);

                    }


                }
                using (sqlconnection con = new sqlconnection(constr4))
                {
                    using (sqlcommand cmd = new sqlcommand(sql2, con))
                    {
                        con.open();
                        int b = cmd.executenonquery();
                        console.writeline(b);

                    }


                }
                sope.complete();
            }
       
        }

 

 总结:

现在知道了transactionscope中的数据库操作实际是参与了其中的环境事务,将它理解为是自动建立的sqltransaction,而嵌套在其中的transactionscope中的数据库操作会添加到这个环境事务中(以transactionscopeoption.required为参数生成的transactionscope)。

  也知道了complete方法并不是执行后,就会提交事务,而只是表明之前的动作都符合要求,只是一种确认,不执行该方法,事务便不能完成。而 只有最外层transactionscope执行了complete方法后,在离开using块时,事务才真正的提交。所以说 transactionscope是能嵌套的。

  transaction类有一静态属性current,在一个transactionscope中的complete方法执行之前可以访问,它返回的便是环境事务。

但是:   进入和退出事务都要快,这一点非常重要,因为事务会锁定宝贵的资源。最佳实践要求我们在需要使用事务之前再去创建它,在需要对其执行命令前迅速打开连接, 执行动作查询 (action query),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的 时间

 

 


        }

总结

以上是凯发k8官方网为你收集整理的分布式事物嵌套事物的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图