sql事務處理
A. 在sql中怎樣使用事務
SQL Server 需要顯示的定義 開始一個事務.
BEGIN TRANSACTION;
例如:
1> BEGIN TRY
2> -- SQL Server 需要顯示的定義 開始一個事務.
3> BEGIN TRANSACTION;
4> -- 插入2條同樣的數據,使主鍵重復,引發錯誤後回滾事務.
5> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7> -- 執行成功後,需要提交事務.
8> COMMIT;
9> END TRY
10> BEGIN CATCH
11> PRINT('Main.錯誤代碼 = ' + STR(ERROR_NUMBER()));
12> PRINT('Main.錯誤嚴重級別 = ' + STR(ERROR_SEVERITY()));
13> PRINT('Main.錯誤狀態代碼 = ' + STR(ERROR_STATE()));
14> PRINT('Main.錯誤信息 = ' + ERROR_MESSAGE());
15> -- 回滾事務
16> ROLLBACK;
17> END CATCH
18>
19> go
B. 在VB中,怎樣對SQL進行事務處理
事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下3種總結整理如下:
方法1:直接寫入到sql中
在存儲過程中使用BEGINTRANS,COMMITTRANS,ROLLBACKTRANS實現
begintrans
declare@orderDetailsErrorint,@procuntErrorint
deletefrom[orderdetails]whereproctid=42
select@orderDetailsError=@@error
deletefromproctswhereproctid=42
select@procuntError=@@error
if(@orderDetailsError=0and@procuntError=0)
COMMITTRANS
else
ROLLBACKTRANS
優點:
所有事務邏輯包含在一個單獨的調用中
擁有運行一個事務的最佳性能
獨立於應用程序
限制:
事務上下文僅存在於資料庫調用中
資料庫代碼與資料庫系統有關
方法2:使用ADO.NET實現
使用ADO.NET實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在數據層來實現。
SqlConnection和OleDbConnection對象有一個BeginTransaction方法,它可以返回SqlTransaction
或者OleDbTransaction對象。而且這個對象有Commit和Rollback方法來管理事務
SqlConnectionsqlConnection=newSqlConnection("workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False");
sqlConnection.Open();
SqlTransactionmyTrans=sqlConnection.BeginTransaction();
SqlCommandsqlInsertCommand=newSqlCommand();
sqlInsertCommand.Connection=sqlConnection
sqlInsertCommand.Transaction=myTrans;
try{
sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('北京',1)";
sqlInsertCommand.ExecuteNonQuery();
sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('上海',1)";
sqlInsertCommand.ExecuteNonQuery();
myTrans.Commit();
}catch(Exceptionex)
{
myTrans.Rollback();
}
finally
{
sqlConnection.Close();
}
優點:
簡單性
和數據據事務差不多的快
獨立於資料庫,不同資料庫的專有代碼被隱藏了
缺點:
事務不能跨越多個資料庫連接
事務執行在資料庫連接層上,所以需要在事務過程中維護一個資料庫連接
ADO.NET分布事務也可以跨越多個資料庫,但是其中一個SQLSERVER資料庫的話,通過用SQLSERVER連接伺服器連接到別的資料庫,但是如果是在DB2和Orcal之間就不可以。
以上兩種事務是經常用到的事務處理方法。
方法3COM+事務(分布式事務)
.NETFramework依靠MTS/COM+服務來支持自動事務。COM+使用(DTC)作為事務管理器和事務協調器在分布式環境中運行事務。
這樣可使.NET應用程序運行跨多個資源結合不同操作(例如,將定單插入SQLServer資料庫、將消息寫入Microsoft消息隊列(MSMQ)隊列、以及從Oracle資料庫檢索數據)
的事務。
COM+事務處理的類必須繼承System.EnterpriseServices.ServicedComponent,其實webservice就是繼承System.EnterpriseServices.ServicedComponent,所以webservice也支持
COM+事務。
定義一個COM+事務處理的類
[Transaction(TransactionOption.Required)]
publicclassDataAccess: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方法。
publicstringtestTransaction()
{
try
{
ContextUtil.EnableCommit();
InsertARecord1();
InsertARecord2();
ContextUtil.SetComplete();
return"succeed!";
}
catch(Exceptionex)
{
ContextUtil.SetAbort();
return"failed!";
}
}
publicvoidInsertARecord1()
{
stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";
SqlConnectionconn=newSqlConnection(strconn);
conn.Open();
SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('北京',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
publicvoidInsertARecord2()
{
stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";
SqlConnectionconn=newSqlConnection(strconn);
conn.Open();
SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('上海',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
在需要事務跨MSMQ和其他可識別事務的資源(例如,SQLServer資料庫)運行的系統中,只能使用DTC或COM+事務,除此之外沒有其他選擇。DTC協調參與分布式事務的所有資源管理器, 也管理與事務相關的操作。
這種做法的缺點是,由於存在DTC和COM互操作性開銷,導致性能降低。
COM+事務處理的類必須強命名。
C. sql中什麼是事務啊
事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種數據項的一個程序執行單元(unit)。
事務通常由高級資料庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。
(3)sql事務處理擴展閱讀
事務類型
(1)手動事務
手動事務允許顯式處理若干過程,這些過程包括:開始事務、控制事務邊界內的每個連接和資源登記、確定事務結果(提交或中止)以及結束事務。
(2)自動事務
.NET 頁、XML Web services方法或 .NET Framework 類一旦被標記為參與事務,它們將自動在事務范圍內執行。您可以通過在頁、XML Web services 方法或類中設置一個事務屬性值來控制對象的事務行為。
D. 如何在VFP里寫SQL Server的事務處理
*********************************************************************************
Transactions_error=.f.&&事務過程失敗標志
=SQLSETPROP(myconnect,『Transactions』,2)&&啟動手動事務處理
**————————————————————
TEXTTOsql_tmp1NOSHOW
INSERTINTOamt_bum(id_bum,bum_bh)
values(?id_bum,?bum_bh)
IF(SELECTcount(1)FROMamt_bumWHEREbum_bh=?bum_bh)>1
SELECT9asok
ELSE
SELECT1asok
ENDTEXT
**————————————-
IFTransactions_error=.F.
SELECTMy_mt_bum_fm_bum
IFsqlexec(myconnect,sql_tmp1,』My_mt_bum_fm_my_int_tm』)<=0
WAITWINDOW"新增部門資料失敗!"NOWAIT
Transactions_error=.t.
ELSE
SELECTMy_mt_bum_fm_my_int_tm
DOcase
CASEok=1
**正常
CASEok=9
MESSAGEBOX("此部門有重復不允許存檔!","")
Transactions_error=.t.
ENDCASE
use
ENDIF
ENDIF
**————————————-
IFTransactions_error=.t.
=SQLROLLBACK(myconnect)
ELSE
=SQLCOMMIT(myconnect)
WAITWINDOW"數據存檔成功!"NOWAIT
ENDIF
=SQLSETPROP(myconnect,『Transactions』,1)&&恢復自動事務處理
*********************************************************************************
E. 如何清空 SQL 伺服器事務處理日誌
這里的事務日誌清理是指截斷事務日誌並釋放空間。
操作方法:
1、通過備份事務日誌進行截斷
備份時的默認選項就是Truncate the transaction log(截斷事務日誌),備份完成後,事務日誌就會自動被截斷,但這時你查看日誌文件的大小還是和原來一樣。所以,需要通過第二步釋放日誌文件佔用的空間。
2、通過收縮日誌文件釋放日誌文件佔用的空間
將恢復模式由完整(Full)改為簡單(Simple)
收縮(Shrink)日誌文件
將恢復模式由簡單(Simple)改為完整(Full)
3、收縮資料庫(Shrink database)
F. SQL server中的事務與批處理語句有什麼區別
ACID,是指在可靠資料庫管理系統(DBMS)中,事務(transaction)所應該具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability).這是可靠資料庫所應具備的幾個特性.下面針對這幾個特性進行逐個講解.
原子性意味著資料庫中的事務執行是作為原子。即不可再分,整個語句要麼執行,要麼不執行。 在SQL SERVER中,每一個單獨的語句都可以看作是默認包含在一個事務之中:
對於用戶來說,要用事務實現的自定義原子性往往是和業務相關的,比如銀行轉賬,從A賬戶減去100,在B賬戶增加100,如果這兩個語句不能保證原子性的話,比如從A賬戶減去100後,伺服器斷電,而在B賬戶中卻沒有增加100.雖然這種情況會讓銀行很開心,但作為開發人員的你可不希望這種結果.而默認事務中,即使出錯了也不會整個事務進行回滾。而是失敗的語句拋出異常,而正確的語句成功執行。這樣會破壞原子性。所以SQL SERVER給予了一些選項來保證事務的原子性.
資料庫中實現事務性有三種方法,這里只介紹前兩種方法:
1. 在事務語句最前面加上set xact_abort on
如:
create procere SP_Trans_Account @UserID int,@DestID int,@imoney bigint
as
begin
set xact_abort on
begin tran
update TUserInfo set WalletMoney=WalletMoney+@imoney where UserID=@DestID
update TUserInfo set WalletMoney=WalletMoney-@imoney where UserID=@UserID
commit tran
end當xact_abort 選項為on 時,SQL Server在遇到錯誤時會終止執行並rollback 整個事務。
2. 在每個單獨的DML語句執行後,立即判斷執行狀態,並做相應處理。
create procere SP_Trans_Account @UserID int,@DestID int,@imoney bigint
begin tran
update TUserInfo set WalletMoney=WalletMoney+@imoney where UserID=@DestID
update TUserInfo set WalletMoney=WalletMoney-@imoney where UserID=@UserID
if @@error<>0 --如果不為零,表示事務發生錯誤,則回滾事務
begin
rollback tran
end
else
begin
commit tran --提交事務
end
原文鏈接:網頁鏈接
G. sql的事務問題
如果沒有猜錯,樓主應該是在執行COMMIT TRANSACTION tran3 後,直接在當前的查詢界面查看的表裡的數據吧?對於當前會話,即使你沒有執行COMMIT,所有數據都會在當前的會話里發生變化,你可以不執行COMMIT TRANSACTION tran3,直接查看錶里的數據,你會看到即使沒有提交任何事物,表裡的數據還是發生變化了。如果你再打開一個查詢窗口,你會發現直接從testtran 表裡select數據是會一直等待的,因為其它會話(也就是開始你執行begin tran那個會話)有事務沒有提交,表是鎖定的。事務是用來保證多個會話之間不會應為事務不一致而產生臟數據。對同一會話,是看不出效果的。
H. SQL 對事務的管理包括哪幾方面
首先你得了解什麼是事務?
第一點:事務是一種機制.是一個操作序列,它包含一組資料庫操作命令,並且所有的命令作為一個整體一起向系統提交或撤消,即這一組資料庫命令要麼都執行,要麼都不執行.
第二點:你要了解事務的4個屬性,即ACID
原子性:事務是一個完整的操作
一致性:當事務完成時,數據是必須處於一致狀態
隔離性:對數據進修改的所有並發事務是彼此隔離的.
持久性:事務完成後,它對於系統的影響是永久的.
而你問如何管理事務,主要由下列語句
1.開始事務:begin tran
2.提交事務:commit tran
3.回滾事務:rollback tran
至於如何運用這些語句,其實很簡單,你在編寫事務SQL語句時,一定會存在if語句,也就是說,你認為對的,是正確的,就寫上提交事務,你認為錯了就回滾事務,但這些必須是語句最開頭寫上開始事務!