事务(Transaction),是指一个工作单元,在这个整体中所有对数据库的操作要么全部执行成功,要不全不执行,用"不成功,便成仁"来形容比较恰当。
(1)、在ADO.NET中,使用Connection对象的BeginTransaction方法来初始化Transaction对象,然后将该对象赋值给Command对象的一个属性Transaction,执行对数据库的操作,若成功,则调用Transaction对象的Commit方法来提交事务,如若失败,则调用Transaction对象的RollBack方法进行事务的回滚。下面就来写下具体的操作代码:
.....
using System.Data.SqlClient;
......
string strSQL = string.Empty;
using(SqlConnection con = new SqlConnection("数据库连接字符串"))
{
con.Open();
SqlTransaction trans = con.BeginTransaction();
SqlCommand cmd = null;
cmd.Connection = con;
cmd.Transaction = trans;
try
{
strSQL = "insert into Users values('admin','admin')";
cmd.CommandText = strSQL;
cmd.ExecuteNonQuery();
strSQL = "update Users set pwd= ' "+admin888 + " ' where uid=admin";
cmd.CommandText = strSQL;
cmd.ExecuteNonQuery();
trans.Commit();
}
catch(SqlException ex)
{
Response.Write(ex.Message);
Trans.RollBack();
}
}
(2)、分布式事务
在网站开发中,我们经常会遇到这样一种情况,由于网站访问量非常大,注册的用户又比较多,一台服务器难以储存众多的用户信息,怎么办呢?
通常的做法是,使用二个或二个以上的服务器,将用户的登录信息放在中心机房的SQL Server数据库服务器中,而将用户的物品消费信息放在另外一个服务器中,这样每次新增加一个用户的话,就得在中心机房的数据库服务器中增加一个用户的信息,同时在另外一个服务器上也得相应增加该用户以及相关的消费信息,这里同样涉及到事务问题,若增加成功,两台数据库服务器中应同时增加了用户的信息,若一台服务器上出现错误,未能保存用户的信息,则另外一台服务器上也不能保存数据,既是事务整体提交失败,回滚到操作前的状态.
像上面的这种情况,涉及到多个数据库服务器,就牵涉到在2个或2个以上的SqlConnection对象上执行事务,这就是分布式事务处理。
分布式事务处理,要用到System.Transaction命名空间下的TransactionScope类,在使用之前首先添加System.Transactions.dll
的引用.具体的操作代码如下:
......
......
string strSQL = string.Empty;
using(TransactionScope scope = new TransactionScope())
{
SqlConnection con1 = new SqlConnection("数据库连接字符串1");
SqlConnection con2 = new SqlConnection("数据库连接字符串2");
try
{
con1.Open();
strSQL = "insert into Users values('admin','admin')";
SqlCommand cmd1 = new SqlCommand(strSQL,con1);
cmd1.ExecuteNonQuery();
con2.Open();
strSQL = "insert into Consumption values('100','admin')";
SqlCommand cmd2 = new SqlCommand(strSQL,con2);
cmd2.ExecuteNonQuery();
}
catch(SqlException ex)
{
Response.Write(ex.Message);
}
scope.Complete();
con1.Close();
con2.Close();
}
.........
分布式事务的处理并不是由ADO.NET来管理的,而是由MSDTC服务来管理的,这是一个基于COM+的技术,DTC是Distributed Transaction Coordinator的缩写,既是分布式服务协调者的意思,由此也可以看出它的作用。
TransactionScope类所支持的分布式事务管理,也并非由TransactionScope类来完成,而是提交给本地机上的DTC服务来完成的,因此在使用分布式事务时,要开启本机的DTC服务,通过运行net start msdtc命令即可。