事务是这样一种机制,它确保多个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);
}
}
|
注意:
• 优点:
– 简单性
– 和数据据事务差不多的快
– 独立于数据库,不同数据库的专有代码被隐藏了
• 缺点:
– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。