asp.net 4种事务

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} p {mso-style-noshow:yes; mso-style-priority:99; mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

在一个MIS 系统中, 没有用事务那就绝对是有问题的, 要么就只有一种情况:你的系统实在是太小了, 业务业务逻辑有只要一步执行就可以完成了。因此掌 握事务处理的方法是很重要,进我的归类在.net 中大致有以下4 种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。

1 SQL 事务

    sql 事务是使用SQL server 自身的事务:在存储过程中直接使用Begin TranRollback TranCommit Tran 实现事务:

优点:执行效率最佳

限制:事务上下文仅在数据库中调用,难以实现复杂的业务 逻辑。

Demo :(所有demo, 都以SQL Server 自带的Northwind 数据的表Region 为例)

带事务 的储存过程:

CREATE PROCEDURE dbo.SPTransaction

     (

    @UpdateID int,

      @UpdateValue nchar(50),

    @InsertID int,

    @InsertValue nchar(50)

     )

AS

begin Tran

Update Region  Set RegionDescription=@UpdateValue where RegionID=@UpdateID

 

insert into Region Values (@InsertID,@InsertValue)

 

declare @RegionError int

select @RegionError=@@error

if(@RegionError=0)

COMMIT Tran

else

ROLLBACK Tran

GO

执行带事务的 储存过程:

/// <summary>

        /// SQL 事务:

        /// </summary>

        public void SQLTran()

        {

             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");

             SqlCommand cmd = new SqlCommand();

             cmd.CommandText = "SPTransaction";

             cmd.CommandType = CommandType.StoredProcedure;

             cmd.Connection = conn;

             conn.Open();

             SqlParameter[] paras= new SqlParameter[]{

                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),

                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),

                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),

                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};

             paras[0].Value = "2";

             paras[1].Value = "Update Value1";

             paras[2].Value = "6";

             paras[3].Value = "Insert Value1";

            foreach (SqlParameter para in paras )

            {

                 cmd.Parameters.Add(para);

             }

             cmd.ExecuteNonQuery();  

         }

2 ADO.net 事务

   Ado.net 事务可能是大家一般都用的

优点:简单,效率和数据库事务差不多。

缺点:事务不能跨数据库,只能在一个数 据库连接上。如果是两个数据库上就不能使用该事务了。

Demo:

         /// <summary>

        /// 一般的ADO.net 事务

        /// </summary>

        public void ADONetTran1()

        {

             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");

             SqlCommand cmd = new SqlCommand();

            try

            {

                 cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID ";

                 cmd.CommandType = CommandType.Text;

                 cmd.Connection = conn;

                 conn.Open();

                 SqlParameter[] paras = new SqlParameter[]{

                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),

                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};

                 paras[0].Value = "2";

                 paras[1].Value = "Update Value12";

               foreach (SqlParameter para in paras)

                {

                     cmd.Parameters.Add(para);

                 }

                // 开始事务

                 cmd.Transaction = conn.BeginTransaction();

                 cmd.ExecuteNonQuery();

                 cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";

                 cmd.CommandType = CommandType.Text;

                 paras = new SqlParameter[]{

                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),

                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};

                 paras[0].Value = "7";

                 paras[1].Value = "Insert Value";

                 cmd.Parameters.Clear();

                foreach (SqlParameter para in paras)

                {

                     cmd.Parameters.Add(para);

                 }

               

                 cmd.ExecuteNonQuery();

                // 提交事务

                 cmd.Transaction.Commit();

             }

            catch

            {

                // 回滚事务

                 cmd.Transaction.Rollback();

                throw;

             }

            finally

            {

                 conn.Close();

             }

         }

3 TransactionScope 事务
TransactionScope
事务类,它可以使代码块成为事务性代码。并自 动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
Demo:
          /// <summary>
        /// TransactionScope
事务: 可自动提升事务为完全分布式事务的轻型(本地)事务。
        ///
使用时要保证MSDTC 服务( 控制分布事务) 是开启的可以使用:net start msdtc 命令开启服务;
        /// </summary>
        public void ADONetTran2()
        {
              SqlConnection conn = new SqlConnection"Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
              SqlCommand cmd = new SqlCommand();
            try
            {
             
                using (System.Transactions.TransactionScope ts = new TransactionScope())
                {
                   
                     cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID ";
                     cmd.CommandType = CommandType.Text;
                     cmd.Connection = conn;
                     conn.Open();
                     SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                     paras[0].Value = "2";
                     paras[1].Value = "Update Value12";

                    foreach (SqlParameter para in paras)
                    {
                         cmd.Parameters.Add(para);
                     }
                     cmd.ExecuteNonQuery();


                     cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                     cmd.CommandType = CommandType.Text;

                     paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                     paras[0].Value = "8";
                     paras[1].Value = "Insert Value";

                     cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                         cmd.Parameters.Add(para);
                     }

                     cmd.ExecuteNonQuery();
                    //
提交事务
                     ts.Complete();
                 }
             }
            catch
            {
                throw;
             }
            finally
            {
                 conn.Close();
             }

         }

4 COM+ 事务
在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不 能满足业务的要求了。在COM+ 中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:
         /// <summary>
        /// COM+
事务
        /// </summary>
        public void ComTran()
        {
             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
             SqlCommand cmd = new SqlCommand();
             ServiceConfig sc = new ServiceConfig();

            // 指定事务类型
             sc.Transaction = TransactionOption.Required;
            //
设置启动跟踪
             sc.TrackingEnabled = true;
            //
创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。
            //
随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
            //
接着,新的上下文被推至上下文堆栈,成为当前上下文
             ServiceDomain.Enter(sc);
            try
            {
                     cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID ";
                     cmd.CommandType = CommandType.Text;
                     cmd.Connection = conn;
                     conn.Open();
                     SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                     paras[0].Value = "2";
                     paras[1].Value = "Update Value22";

                    foreach (SqlParameter para in paras)
                    {
                         cmd.Parameters.Add(para);
                     }
                     cmd.ExecuteNonQuery();


                     cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                     cmd.CommandType = CommandType.Text;

                     paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                     paras[0].Value = "9";
                     paras[1].Value = "Insert Value";

                     cmd.Parameters.Clear();
                   foreach (SqlParameter para in paras)
                    {
                         cmd.Parameters.Add(para);
                     }

                     cmd.ExecuteNonQuery();

                    // 提交事务
                     ContextUtil.SetComplete();
             }
            catch
            {
                //
回滚事务
                 ContextUtil.SetAbort();
                throw;
             }
            finally
            {
                 conn.Close();
                //
触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
                //
然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。
                 ServiceDomain.Leave();
             }

         }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值