如何实现数据回滚
现有数据库a1,a2,程序里a1.insertData("bb");a2.insertData("bb");当a1录入失败后,a2就不执行,或者a2录入失败后a1实现数据回滚
[解决办法]
你的这个情况属于分布式事务处理范畴。
分布式事务处理不是由ADO.NET来管理的,而是由MSDTC服务来管理的,这是一个基于COM+的技术。
DTC(Distributed Transaction Coordinator)分布式服务协调者的缩写。
TransactionScope类所支持的分布式事务管理 是提交给本地机的DTC服务来管理的,所以在分布式事务处理之前,要开启本机的DTC服务,运行net start msdtc命令即可。
using(TransactionScope scope = new TransactionScope())
{
string strSQL = "数据库连接字符串";
using(SqlConnection con = new SqlConnection(strSQL))
{
try
{
con.Open();
string sql_1 = "语句一";
SqlCommand cmd = new SqlCommand(con,sql_1);
cmd.ExecuteNonQuery();
string sql_2 = "语句二";
SqlCommand cmd2 = new SqlCommand(con,sql_2);
cmd2.ExecuteNonQuery();
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
}
scope.Complete();
}
//执行事务处理
public void DoTran()
{ //建立连接并打开
SqlConnection myConn=GetConn();
myConn.Open();
SqlCommand myComm=new SqlCommand();
//SqlTransaction myTran=new SqlTransaction();
//注意,SqlTransaction类无公开的构造函数
SqlTransaction myTran;
//创建一个事务
myTran=myConn.BeginTransaction();
try
{
//从此开始,基于该连接的数据操作都被认为是事务的一部分
//下面绑定连接和事务对象
myComm.Connection=myConn;
myComm.Transaction=myTran; //定位到pubs数据库
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();//操作1
myComm.CommandText=""; //操作2
myComm.ExecuteNonQuery();
//提交事务
myTran.Commit();
}
catch(Exception err)
{
myTran.Roback();
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
}
finally
{
myConn.Close();
}
}
using(SqlConnection conn=new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString) )
{
SqlTransaction transaction=null;
try
{
conn.Open();
transaction = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = transaction;
cmd.CommandText = "exec sp_insert_tbuser 'saeven','user','password'";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into tbuser (username,usergroup,userpwd)values( 'a,b,c)";
cmd.ExecuteNonQuery();
transaction.Commit();
MessageBox.Show("OK");
}
catch(Exception ex)
{
transaction.Rollback();
MessageBox.Show(ex.Message);
}
}