在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。
CREATEPROCEDUREdbo.SPTransaction
(
@UpdateIDint,
@UpdateValuenchar(50),
@InsertIDint,
@InsertValuenchar(50)
)
AS
beginTran
UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID
insertintoRegionValues(@InsertID,@InsertValue)
declare@RegionErrorint
select@RegionError=@@error
if(@RegionError=0)
COMMITTran
else
ROLLBACKTran
GO
net中的4种事务总结
///<summary>
///一般的ADO.net事务
///</summary>
publicvoidADONetTran1()
{
SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Northwind;PersistSecurityInfo=True;UserID=sa;Password=123;");
SqlCommandcmd=newSqlCommand();
try
{
cmd.CommandText="UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID";
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
conn.Open();
SqlParameter[]paras=newSqlParameter[]{
newSqlParameter("@UpdateID",SqlDbType.Int,32),
newSqlParameter("@UpdateValue",SqlDbType.NChar,50)};
paras[0].Value="2";
paras[1].Value="UpdateValue12";
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction=conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.CommandText="insertintoRegionvalues(@InsertID,@InsertValue)";
cmd.CommandType=CommandType.Text;
paras=newSqlParameter[]{
newSqlParameter("@InsertID",SqlDbType.Int,32),
newSqlParameter("@InsertValue",SqlDbType.NChar,50)};
paras[0].Value="7";
paras[1].Value="InsertValue";
cmd.Parameters.Clear();
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}
}
3 TransactionScope事务
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
///<summary>
///TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。
///使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:netstartmsdtc命令开启服务;
///</summary>
publicvoidADONetTran2()
{
SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Northwind;PersistSecurityInfo=True;UserID=sa;Password=123;");
SqlCommandcmd=newSqlCommand();
try
{
using(System.Transactions.TransactionScopets=newTransactionScope())
{
cmd.CommandText="UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID";
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
conn.Open();
SqlParameter[]paras=newSqlParameter[]{
newSqlParameter("@UpdateID",SqlDbType.Int,32),
newSqlParameter("@UpdateValue",SqlDbType.NChar,50)};
paras[0].Value="2";
paras[1].Value="UpdateValue12";
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
cmd.CommandText="insertintoRegionvalues(@InsertID,@InsertValue)";
cmd.CommandType=CommandType.Text;
paras=newSqlParameter[]{
newSqlParameter("@InsertID",SqlDbType.Int,32),
newSqlParameter("@InsertValue",SqlDbType.NChar,50)};
paras[0].Value="8";
paras[1].Value="InsertValue";
cmd.Parameters.Clear();
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
ts.Complete();
}
}
catch
{
throw;
}
finally
{
conn.Close();
}
}