zoukankan      html  css  js  c++  java
  • ADO 事务

    Ado.Net事务处理。
    在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
    • 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
    • 将Transaction 对象分配给要执行的Command的Transaction 属性。
    • 执行所需的命令。
    • 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
    当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。
    • 优点:
    – 简单性
    – 和数据据事务差不多的快
    – 独立于数据库,不同数据库的专有代码被隐藏了
    • 缺点:
    – 事务不能跨越多个数据库连接
    – 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
    下边我们看一个例子,建立一个页面,同样简单,只需要一个按钮,然后编程:

     1using System;
     2using System.Data;
     3using System.Configuration;
     4using System.Collections;
     5using System.Web;
     6using System.Web.Security;
     7using System.Web.UI;
     8using System.Web.UI.WebControls;
     9using System.Web.UI.WebControls.WebParts;
    10using System.Web.UI.HtmlControls;
    11using System.Data.SqlClient;
    12
    13namespace WebApplication1
    14{
    15    public partial class AdoAction : System.Web.UI.Page
    16    {
    17        protected void Page_Load(object sender, EventArgs e)
    18        {
    19
    20        }
    21
    22        protected void btn_Click(object sender, EventArgs e)
    23        {
    24            SqlConnection con = new SqlConnection();
    25            con.ConnectionString=ConfigurationManager.ConnectionStrings["DSN"].ConnectionString;
    26            con.Open();
    27            //启动一个事务。
    28            SqlTransaction myTran = con.BeginTransaction();
    29            //为事务创建一个命令,注意我们执行双条命令,第一次执行当然成功。我们再执行一次,失败。
    30            //第三次我们改其中一个命令,另一个不改,这时候事务会报错,这就是事务机制。
    31            SqlCommand myCom = new SqlCommand();
    32            myCom.Connection = con;
    33            myCom.Transaction = myTran;
    34            try
    35            {
    36                myCom.CommandText = "insert into SqlAction values ('测试2','111')";
    37                myCom.ExecuteNonQuery();
    38                myCom.CommandText = "insert into SqlAction values ('测试3','111')";
    39                myCom.ExecuteNonQuery();
    40                myTran.Commit();
    41                Response.Write("成功执行");
    42
    43            }
    44            catch (Exception Ex)
    45            {
    46                myTran.Rollback();
    47                //创建并且返回异常的错误信息
    48                Response.Write(Ex.ToString());
    49                Response.Write("写入数据库失败");
    50            }
    51            finally
    52            {
    53                con.Close();
    54            }
    55 
    56        }
    57
    58
    59    }
    60} 
     
     
     

    ADO.NET事务测试代码:

    using(MySqlConnection conn = new MySqlConnection(GetConnection()))
            {
                conn.Open();
                //启动一个事务
                using(MySqlTransaction transaction = conn.BeginTransaction())
                {
                    using (MySqlCommand cmd = conn.CreateCommand())
                    {
                        try
                        {
                            cmd.Transaction = transaction;  //为命令指定事务
                            cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0009','Name0002');";
                            cmd.ExecuteNonQuery();
                            cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0008','Name0003');";
                            cmd.ExecuteNonQuery();
                            transaction.Commit();   //事务提交
                            Response.Write("<script>alert('成功写入记录');</script>");
                        }
                        catch(Exception ex)
                        {
                            transaction.Rollback(); //事务回滚
                            Response.Write(ex.Message);
                            Response.Write("<script>alert('写入记录失败');</script>");
                        }
     
                    }
                }
            }

    代码分析:

    如示例代码手动创建ADO.NET事务步骤如下:

    1)使用MySqlConnection类的BeginTransaction()方法返回一个MySqlTransaction类型的对象;

    2)使用MySqlCommand类对象的Transaction属性将要参与事务处理的每条命令关联到上一不返回的MySqlTransaction类型的对象上;

    3)如果事务可以成功完成,使用MySqlTransaction对象的Commit()方法提交事务处理结果;

    4)如果事务处理中发生错误,就调用MySqlTransaction对象的Rollback()方法,撤销每一个修改。


    ADO.NET事务的缺点;

    ADO.NET事务只能处理关联到一个连接上的本地事务,不支持跨多个连接的事务。(为了克服这一缺点,下一节将介绍基于System.Transaction命名空间的分布式事务)。

  • 相关阅读:
    数据规范化(normalization)
    《穷爸爸富爸爸》笔记
    期望,方差,协方差,相关系数,协方差矩阵,相关系数矩阵,以及numpy实现
    numpy array和mat的乘法
    matlab多图排列
    POJ 3463
    POJ 3463
    Poj2449 第k短路
    Poj2449 第k短路
    POJ 3013
  • 原文地址:https://www.cnblogs.com/jinhaoObject/p/4606046.html
Copyright © 2011-2022 走看看