SQL事务 & ADO.NET事务
2014-03-26 15:26
381 查看
1 SQL事务
sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)
带事务的储存过程:
CREATEPROCEDURE dbo.SPTransaction
(
@UpdateIDint,
@UpdateValuenchar(50),
@InsertIDint,
@InsertValuenchar(50)
)
AS
beginTran
Update Region Set RegionDescription=@UpdateValuewhere RegionID=@UpdateID
insertinto Region Values (@InsertID,@InsertValue)
declare@RegionErrorint
select@RegionError=@@error
if(@RegionError=0)
COMMITTran
else
ROLLBACKTran
GO
执行带事务的储存过程:
///<summary>
/// SQL事务:
///</summary>
publicvoid SQLTran()
{
SqlConnection conn =new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd =new SqlCommand();
cmd.CommandText ="SPTransaction";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras=new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value ="2";
paras[1].Value ="Update Value1";
paras[2].Value ="6";
paras[3].Value ="Insert Value1";
foreach (SqlParameter para in paras )
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
}
2 ADO.net事务
Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:
///<summary>
/// 一般的ADO.net 事务
///</summary>
publicvoid ADONetTran1()
{
SqlConnection conn =new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd =new SqlCommand();
try
{
cmd.CommandText ="Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras =new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value ="2";
paras[1].Value ="Update Value12";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.CommandText ="insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras =new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value ="7";
paras[1].Value ="Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}
}
sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)
带事务的储存过程:
CREATEPROCEDURE dbo.SPTransaction
(
@UpdateIDint,
@UpdateValuenchar(50),
@InsertIDint,
@InsertValuenchar(50)
)
AS
beginTran
Update Region Set RegionDescription=@UpdateValuewhere RegionID=@UpdateID
insertinto Region Values (@InsertID,@InsertValue)
declare@RegionErrorint
select@RegionError=@@error
if(@RegionError=0)
COMMITTran
else
ROLLBACKTran
GO
执行带事务的储存过程:
///<summary>
/// SQL事务:
///</summary>
publicvoid SQLTran()
{
SqlConnection conn =new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd =new SqlCommand();
cmd.CommandText ="SPTransaction";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras=new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value ="2";
paras[1].Value ="Update Value1";
paras[2].Value ="6";
paras[3].Value ="Insert Value1";
foreach (SqlParameter para in paras )
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
}
2 ADO.net事务
Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:
///<summary>
/// 一般的ADO.net 事务
///</summary>
publicvoid ADONetTran1()
{
SqlConnection conn =new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd =new SqlCommand();
try
{
cmd.CommandText ="Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras =new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value ="2";
paras[1].Value ="Update Value12";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.CommandText ="insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras =new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value ="7";
paras[1].Value ="Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}
}
相关文章推荐
- ADO.NET+ASP.NET+SQL--事务
- 黑马程序员之ADO.NET学习笔记: SqlTransaction(事务)
- ADO.NET 2.0中新的事务处理机制的引入带来前所未有的新体验(给所有不了解TransactionScope的朋友,以及还在用SqlTransaction的朋友)
- ADO.NET Entity Framework: The version of SQL Server in use does not support datatype 'datetime2'
- SQL事务与ADO.NET事务
- SQL 和存储过程级别的事务及ADO.NET级别的事务
- SQL Server Compact 3.5 B2 & Sync Services for ADO.NET Documentation released
- Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3
- 事务的两种用法(1.在SQL中写存储过程 2.在ADO.NET中处理)各有优点
- sqldatareader返回数据集,并要求使用ADO.net事务的解决方案
- T-SQL中的事务处理、ADO.NET中的事务处理、LINQ to SQL中的隐式事务处理、分布式事务处理
- Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3
- ADO.NET 对 Microsoft SQL Server 的事务逻辑
- SQL事务与ADO.NET事务
- 黑马程序员之ADO.NET学习笔记:SqlDataReader(数据流读取器)
- 黑马程序员之ADO.NET学习笔记:通过SqlCommand对象执行SQL语句
- ADO.NET中利用DataAdapter进行数据操作(SqlCommandBuilder,AcceptChanges)
- ADO.net实现批量SQL操作.
- 深入了解 SQL Server 2000 与 ADO.NET 中的事务隔离及数据锁定
- ADO.NET学习之防止SQL注入,存储过程,SqlDataReader