sql事務例子
㈠ sql中 事務的作用 什麼情況下要用事務 需要什麼條件
事物一般用在並發操作多張表的時候使用,用於保證用戶的數據完整性~
不需要什麼條件,在對多張關聯表做操作的時候,最好就是加上事物~
㈡ 在VB中,怎樣對SQL進行事務處理
事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下3種總結整理如下:
方法1:直接寫入到sql 中
在存儲過程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現
begin trans
declare @orderDetailsError int,@procuntError int
delete from [order details] where proctid=42
select @orderDetailsError =@@error
delete from procts where proctid=42
select @procuntError=@@error
if(@orderDetailsError =0 and @procuntError=0)
COMMIT TRANS
else
ROLLBACK TRANS
優點:
所有事務邏輯包含在一個單獨的調用中
擁有運行一個事務的最佳性能
獨立於應用程序
限制:
事務上下文僅存在於資料庫調用中
資料庫代碼與資料庫系統有關
方法2 :使用ADO.NET 實現
使用ADO.NET 實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在數據層來實現。
SqlConnection 和OleDbConnection 對象有一個 BeginTransaction 方法,它可以返回 SqlTransaction
或者OleDbTransaction 對象。而且這個對象有 Commit 和 Rollback 方法來管理事務
SqlConnection sqlConnection = new SqlConnection("workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False");
sqlConnection.Open();
SqlTransaction myTrans = sqlConnection.BeginTransaction();
SqlCommand sqlInsertCommand = new SqlCommand();
sqlInsertCommand.Connection = sqlConnection
sqlInsertCommand.Transaction=myTrans;
try{
sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('北京',1)";
sqlInsertCommand.ExecuteNonQuery();
sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('上海',1)";
sqlInsertCommand.ExecuteNonQuery();
myTrans.Commit();
}catch(Exception ex)
{
myTrans.Rollback();
}
finally
{
sqlConnection.Close();
}
優點:
簡單性
和數據據事務差不多的快
獨立於資料庫,不同資料庫的專有代碼被隱藏了
缺點:
事務不能跨越多個資料庫連接
事務執行在資料庫連接層上,所以需要在事務過程中維護一個資料庫連接
ADO.NET分布事務也可以跨越多個資料庫,但是其中一個SQL SERVER 資料庫的話,通過用SQL SERVER連接伺服器連接到別的資料庫,但是如果是在DB2和Orcal之間就不可以。
以上兩種事務是經常用到的事務處理方法。
方法3 COM+事務(分布式事務)
.NET Framework 依靠 MTS/COM+ 服務來支持自動事務。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作為事務管理器和事務協調器在分布式環境中運行事務。
這樣可使 .NET 應用程序運行跨多個資源結合不同操作(例如,將定單插入 SQL Server 資料庫、將消息寫入 Microsoft 消息隊列 (MSMQ) 隊列、以及從 Oracle 資料庫檢索數據)
的事務。
COM+事務處理的類必須繼承System.EnterpriseServices.ServicedComponent,其實web service就是繼承System.EnterpriseServices.ServicedComponent,所以web service也支持
COM+事務。
定義一個COM+事務處理的類
[Transaction(TransactionOption.Required)]
public class DataAccess:System.EnterpriseServices.ServicedComponent
{
}
TransactionOption枚舉類型支持5個COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)
Disabled 忽略當前上下文中的任何事務。
NotSupported 使用非受控事務在上下文中創建組件。
Required 如果事務存在則共享事務,並且如有必要則創建新事務。
RequiresNew 使用新事務創建組件,而與當前上下文的狀態無關。
Supported 如果事務存在,則共享該事務。
一般來說COM+中的組件需要Required 或Supported。當組件用於記錄或查帳時RequiresNew 很有用,因為組件應該與活動中其他事務處理的提交或回滾隔離開來。
派生類可以重載基類的任意屬性。如DataAccess選用Required,派生類仍然可以重載並指定RequiresNew或其他值。
COM+事務有手動處理和自動處理,自動處理就是在所需要自動處理的方法前加上[AutoComplete],根據方法的正常或拋出異常決定提交或回滾。
手動處理就是調用ContextUtil類中EnableCommit,SetComplete,SetAbort方法。
public string testTransaction()
{
try
{
ContextUtil.EnableCommit();
InsertARecord1();
InsertARecord2();
ContextUtil.SetComplete();
return "succeed!";
}
catch(Exception ex)
{
ContextUtil.SetAbort();
return "failed!";
}
}
public void InsertARecord1()
{
string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
SqlConnection conn=new SqlConnection(strconn);
conn.Open();
SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('北京',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
public void InsertARecord2()
{
string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
SqlConnection conn=new SqlConnection(strconn);
conn.Open();
SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('上海',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
在需要事務跨 MSMQ 和其他可識別事務的資源(例如,SQL Server 資料庫)運行的系統中,只能使用 DTC 或 COM+ 事務,除此之外沒有其他選擇。DTC 協調參與分布式事務的所有資源管理器, 也管理與事務相關的操作。
這種做法的缺點是,由於存在 DTC 和 COM 互操作性開銷,導致性能降低。
COM+事務處理的類必須強命名。
㈢ SQL 事務的編寫能不能提供一個實例 最好給出一個規范的實例!不要一個sql語句一個提交的那種!要先定義後在
SAVE TRANSACTION 保存點名稱 --自定義保存點的名稱和位置
ROLLBACK TRANSACTION 保存點名稱 --回滾到自定義的保存點
BEGIN TRANSACTION--開始事務
DECLARE @errorSun INT --定義錯誤計數器
SET @errorSun=0 --沒錯為0
UPDATE a SET id=232 WHERE a=1 --事務操作SQL語句
SET @errorSun=@errorSun+@@ERROR --累計是否有錯
UPDATE aa SET id=2 WHERE a=1 --事務操作SQL語句
SET @errorSun=@errorSun+@@ERROR --累計是否有錯
IF @errorSun<>0
BEGIN
PRINT '有錯誤,回滾'
ROLLBACK TRANSACTION--事務回滾語句
END
ELSE
BEGIN
PRINT '成功,提交'
COMMIT TRANSACTION--事務提交語句
END
sql事務處理
BEGIN TRANSACTION--開始事務
DECLARE @errorSun INT --定義錯誤計數器
SET @errorSun=0 --沒錯為0
UPDATE a SET id=232 WHERE a=1 --事務操作SQL語句
SET @errorSun=@errorSun+@@ERROR --累計是否有錯
UPDATE aa SET id=2 WHERE a=1 --事務操作SQL語句
SET @errorSun=@errorSun+@@ERROR --累計是否有錯
IF @errorSun<>0
BEGIN
PRINT '有錯誤,回滾'
ROLLBACK TRANSACTION--事務回滾語句
END
ELSE
BEGIN
PRINT '成功,提交'
COMMIT TRANSACTION--事務提交語句
END
㈣ 事務在SQL中有什麼作用
事務的好處在於,當你需要對多個表進行相關性操作時,使用BeginTrans()開啟事務,然後操作,如果中間哪個表更新出錯了,或者數據有問題,你可以用RollBack()方法在取消之前的相關性操作,如果沒有錯,那就使用Commit()方法提交你的修改。另外,在這個過程中,所有你改動的內容只對你自己有效,別人不能知道你改了什麼,也不能對你正在改的表做修改,直到你提交之後,別人才能修改這些表,檢索出你修改過的內容。