1、SQL事務
2、ADO.NET 事務
在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務。若要執行事務,請執行下列操作:
調用Connection 對象的BeginTransaction 方法來標記事務的開始。
將Transaction 對象分配給要執行的Command的Transaction 屬性。
執行所需的命令。
然後在頁面中添加2個操作,模擬一下在邏輯層調用不同類中的操作的情況 :
優點:執行效率最佳
限制:事務上下文僅在數據庫中調用,難以實現複雜的業務邏輯。
CREATE PROCEDURE Tran1
as
begin tran
set xact_abort on
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(2,'test')
commit tran
GO
--set xact_abort on 表示遇到錯誤立即回滾
--當然你也可以這麼寫
CREATE PROCEDURE tran1
as
begin tran
insert into trantest(id,test)values(1,'test')
if(@@error<>0)
rollback tran
else
begin
insert into trantest(id,test)values(2,'test')
if(@@error<>0)
rollback tran
else
commit tran
end
GO
2、ADO.NET 事務
在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務。若要執行事務,請執行下列操作:
調用Connection 對象的BeginTransaction 方法來標記事務的開始。
將Transaction 對象分配給要執行的Command的Transaction 屬性。
執行所需的命令。
調用Transaction 對象的Commit 方法來完成事務,或調用Rollback 方法來取消事務。
缺點:事務執行在數據庫連接層上,所以你需要在事務過程中手動的維護一個連接。
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
conn.Open();
SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tx;
try
{
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試2','2')";
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
throw new Exception(ex.Message, ex);
}
finally
{
conn.Close();
}
3、TransactionScope事務
在.NET 2.0中新添加了一個名爲System.Transactions的命名空間,其提供了一個“輕量級”的、易於使用的事務框架,通過這個框架可以大大簡化事務的操作。
這個框架提供瞭如下優點:
(1)在簡單(不涉及分佈式)事務中也可以使用聲明式的事務處理方法,而不必使用Com+容器和目錄註冊。
(2)用戶根本不需要考慮是簡單事務還是分佈式事務。它實現一種所謂自動提升事務機制(Promotable Transaction),會自動根據事務中涉及的對象資源判斷使用何種事務管理器。
TransactionScope事務類,它可以使代碼塊成爲事務性代碼。並自動提升爲分佈式事務
優點:實現簡單,同時能夠自動提升爲分佈式事務
TransactionOptions option = new TransactionOptions();
option.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試2','2')";
cmd.ExecuteNonQuery();
}
ts.Complete();
}
4、EnterpriseServices實現事務
就是利用com+實現自動處理事務。
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
使用方法參考:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;816141
隨便建立一個按鈕,在按鈕中進行如下操作:
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
然後在頁面中添加2個操作,模擬一下在邏輯層調用不同類中的操作的情況 :
private void work1()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
private void work2()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);
conn.Open();
cmd2.ExecuteNonQuery();
conn.Close();
}
修改前臺頁面在<%Page後面添加 Transaction="Required" 即可