ADO.NET中事务处理方法总结

作者:袖梨 2022-06-25

事务是这样一种机制,它确保多个SQL语句被当作单个工作单
元来处理。事务具有以下的作用:
* 一致性:同时进行的查询和更新彼此不会发生冲突,其他
用户不会看到发生了变化但尚未提交的数据。
* 可恢复性:一旦系统故障,数据库会自动地完全恢复未完
成的事务。


Ado.Net事务处理。
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
• 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
• 将Transaction 对象分配给要执行的Command的Transaction 属性。
• 执行所需的命令。
• 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。

 代码如下 复制代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;

namespace dotNET
{
    public partial class 事务处理 : System.Web.UI.Page
    {
        string conn = "Data Source=.;Initial Catalog=test;Integrated Security=True";
        SqlConnection con;
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
           
            con = new SqlConnection(conn);
            con.Open();
            //启动一个事务。
            SqlTransaction myTran = con.BeginTransaction();

            SqlCommand myCom = new SqlCommand();
            myCom.Connection = con;
            myCom.Transaction = myTran;
            try
            {
                myCom.CommandText = "insert into fenye(value) values('zz')";//这条没有插入数据库
                myCom.ExecuteNonQuery();
                myCom.CommandText = "insert into fenye2(value) values('zz2')";
                myCom.ExecuteNonQuery();
                myTran.Commit();
                Response.Write("成功执行!1");
            }
            catch (Exception Ex)
            {
                myTran.Rollback();
                //创建并且返回异常的错误信息
                Response.Write(Ex.ToString());
                Response.Write("写入数据库失败");
            }
            finally
            {
                con.Close();
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            using (TransactionScope tsCope = new TransactionScope())
            {
                using (con = new SqlConnection(conn))
                {
                    SqlCommand cmd = new SqlCommand("insert into fenye(value) values('zz')", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                using (con = new SqlConnection(conn))
                {
                    SqlCommand cmd = new SqlCommand("insert into fenye2(value) values('zz2')", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                Response.Write("执行成功!2");
                tsCope.Complete();
            }
        }
    }
}

代码2

 代码如下 复制代码

private void button1_Click(object sender, System.EventArgs e)
 {
  SqlConnection conn = new SqlConnection("Data Source=192.168.2.200;uid=sa; password=;database = HaierHR");
   conn.Open();
   //启用事务
  SqlTransaction tran = conn.BeginTransaction();
  SqlCommand cmd = new SqlCommand();
   cmd.Connection = conn;
   cmd.Transaction = tran;
   try
   {
   cmd.CommandText = "UPDATE HRRollMain Set TotalMember=TotalMember-100 WHERE RollID = '2005070101'";
    cmd.ExecuteNonQuery();
   cmd.CommandText = "UPDATE HRRollSum Set TotalSumMember=TotalSumMember+100 WHERE RollSumID = '20050701'";
    cmd.ExecuteNonQuery();
   tran.Commit();
    MessageBox.Show("事务提交成功!");
   }
  catch(Exception ex)
   {
   tran.Rollback();
    MessageBox.Show("Error!"+ex.Message);
  }   
  }

注意:

• 优点:
– 简单性
– 和数据据事务差不多的快
– 独立于数据库,不同数据库的专有代码被隐藏了
• 缺点:
– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。

相关文章

精彩推荐