1、Sql中的事務html
(1)開始事務:begin transactionsql
(2)提交事務:commit transaciton數據庫
(3)回滾事務:rollback transaction併發
4.分類函數
(一)顯性事務:用begin transaction明確指定事務的開始。測試
(二)隱形事務:spa
打開隱形事務:set implicit transcations onserver
當以隱性事務模式操做時,SQL Sverler將在提交或回滾事務後自動啓動新事務。沒法描述事務的開始,只須要提交或回滾事務。htm
自動提交事務:sql server的默認模式,它將每條單獨的T-SQL語句視爲一個事務。若是成功執行,則自動提交;不然回滾。blog
默認狀況下若是執行一個事務中出現錯誤,則只回滾錯誤操做語句(就是說這句不執行了,算不上回滾),錯誤處以前或以後的正確操做語句仍是會被提交.
Use TestDB
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('3','Name3')
Commit TransAction
/*
Select 一下 有'1','Name1'和'3','Name3',
說明只有第二句的錯誤被取消了
*/
所有回滾的方法1:打開 XACT_ABORT
Use TestDB
SET XACT_ABORT ON -- 打開
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('3','Name3')
Commit TransAction
/*
當 SET XACT_ABORT 爲 ON 時,
若是執行 Transact-SQL 語句產生運行時錯誤,
則整個事務將終止並回滾。
默認狀況下它是OFF狀態。
*/
所有回滾方法2:使用Try...Catch
Use TestDB
Begin Try
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('3','Name3')
Commit TransAction
End Try
Begin Catch
Rollback TransAction
End Catch
/*
使用TryCatch來捕獲異常。
若是 TRY 塊內生成的錯誤致使當前事務的狀態失效,
則將該事務歸類爲不可提交的事務。
若是一般在 TRY 塊外停止事務的錯誤在 TRY 內發生時,
就會致使事務進入不可提交狀態。
不可提交的事務只能執行讀操做或 ROLLBACK TRANSACTION。
該事務不能執行任何可能生成寫操做或 COMMIT TRANSACTION 的 Transact-SQL 語句。
若是事務被分類爲不可提交的事務,則 XACT_STATE 函數會返回值 -1。
*/
所有回滾方法3:自定義錯誤變量
Use TestDB
Declare @tranError int -- 定義變量
Set @tranError=0
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values('3','Name3')
Set @tranError = @tranError + @@Error
If @tranError = 0
Commit TransAction
Else
Rollback TransAction
/*
自定義一個變量來判斷最後是否發生過錯誤。
*/
最後要注意的是:若是一個事務寫了 Begin TransAction 而沒寫 Commit TransAction 或 Rollback TransAction, 則相關操做的數據(也許是表,也許是列,這我還沒測試。。。)會被鎖住。。。而對於鎖住的解決辦法就是單獨執行一下Commit TransAction 或 Rollback TransAction
2、Sqlite中的事務處理機制
在數據庫中使用事務能夠保證數據的統一和完整性,同時也能夠提升效率.
首先事務是能夠把啓動事務過程當中的全部操做視爲事務的過程。等到全部過程執行完畢後,咱們能夠根據操做是否成功來決定事務是否進行提交或者回滾。提交事務後會一次性把全部數據提交到數據庫,若是回滾了事務就會放棄此次的操做,而對原來表的數據不進行更改。
SQLite同T-sql同樣分別以BEGIN、COMMIT和ROLLBACK啓動、提交和回滾事務。
db.beginTransaction(); //手動設置開始事務
try{
//批量處理操做
for(Collection c:colls){
insert(db, c);
}
db.setTransactionSuccessful(); //設置事務處理成功,不設置會自動回滾不提交。
//在setTransactionSuccessful和endTransaction之間不進行任何數據庫操做
}catch(Exception e){
MyLog.printStackTraceString(e);
}finally{
db.endTransaction(); //處理完成
}
使用SQLiteDatabase的beginTransaction()方法能夠開啓一個事務,程序執行到endTransaction() 方法時會檢查事務的標誌是否爲成功,若是程序執行到endTransaction()以前調用了setTransactionSuccessful() 方法設置事務的標誌爲成功,則全部從beginTransaction()開始的操做都會被提交,若是沒有調用setTransactionSuccessful() 方法則回滾事務。
引用連接:
http://www.cnblogs.com/weihengblogs/p/4281148.html
http://www.cnblogs.com/5211314jackrose/p/5818124.html