重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
數據庫事務簡介 數據庫事務是由一組 SQL 語句組成的一個邏輯工作單元 您可以把事務看作是一組不可分的 SQL 語句 這些語句作為一個整體永久記錄在數據庫中或一并撤銷 比如在銀行帳戶之間轉移資金 一條 UPDATE語句將從一個帳戶的資金總數中減去一部分 另一條 UPDATE語句將把資金加到另一個帳戶中 減操作和加操作必須永久記錄在數據庫中 或者必須一并撤銷 — 否則將損失資金 這個簡單的示例僅使用了兩條 UPDATE 語句 但一個更實際的事務可能包含許多 INSERT UPDATE和 DELETE 語句 要永久記錄一個事務中的 SQL 語句的結果 您可以通過 MIT 語句來執行提交 要撤銷 SQL 語句的結果 您可以使用 ROLLBACK 語句來執行回滾 這會把所有的行重設為它們原來的狀態 只要您事先沒有與數據庫斷開 則您在執行回滾之前所做的任何修改都將被撤銷 您還可以設置一個保存點 以便將事務回滾至該特定的點 同時保持事務中的其他語句原封不動 使用數據庫事務(主要針對)您可以使用 OracleTransaction 類的一個對象來表示一個事務 OracleTransaction 類包含多個屬性 其中的兩個為 Connection(指定與事務關聯的數據庫連接)和 IsolationLevel(指定事務隔離級別)Connection 指定與該事務關聯的OracleConnection對象 IsolationLevel 指定該事務的IsolationLevel 枚舉類型 用于對事物的鎖定 取值有Chaos ReadCommited ReadUnmited RepeatableRead Serializable Unspecified 應用程序通過針對OracleConnection對象調用 BeginTransaction 來創建OracleTransaction對象 對OracleTransaction對象執行與該事務關聯的所有后續操作(例如提交或中止該事務) Commit:提交SQL數據庫事務 Rollback :從掛起狀態回滾事務 您還可以使用 Save() 在事務中設置一個保存點 下面的示例創建一個 OracleConnection 和一個 OracleTransaction 它還演示了如何使用 BeginTransaction Commit 和 Rollback 方法 (這是MSDN里的范例)需要注意的是 這些操作需要引入命名空間: Oracle DataAcess ClientOracle DataAccess Client 命名空間是 ODP NET 的一部分 它包含許多類 其中有 OracleConnection OracleCommand 和 OracleTransaction 示例程序就用到了這些類 事務操作 Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String) Dim myConnection As New OracleConnection(myConnString) myConnection Open() Dim myCommand As OracleCommand = myConnection CreateCommand() Dim myTrans As OracleTransaction Start a local transaction myTrans = myConnection BeginTransaction(IsolationLevel ReadCommitted) Assign transaction object for a pending local transaction myCommand Transaction = myTrans Try myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( TECHNOLOGY DENVER ) myCommand ExecuteNonQuery() myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( ENGINEERING KANSAS CITY ) myCommand ExecuteNonQuery() myTrans Commit() Console WriteLine( Both records are written to database ) Catch e As Exception myTrans Rollback() Console WriteLine(e ToString()) Console WriteLine( Neither record was written to database ) Finally myConnection Close() End Try End Sub
創新互聯是一家業務范圍包括IDC托管業務,虛擬空間、主機租用、主機托管,四川、重慶、廣東電信服務器租用,成都二樞服務器租用托管,成都網通服務器托管,成都服務器租用,業務范圍遍及中國大陸、港澳臺以及歐美等多個國家及地區的互聯網數據服務公司。
在 NET 程序中設置事務保存點 正如本文前面所提到的那樣 您可以設置一個保存點 以便將事務回滾至該特定的點 同時保持事務中的其他語句原封不動 您可以使用 OracleTransaction 類的 Save() 方法在事務中設置保存點 如果您有一個非常長的事務并且希望能夠僅回滾到某個特定的時間點 那么您可能要使用保存點 例如 您可能想對 個產品做一些更改 然后設置一個保存點 然后再對另 個產品做更改 如果您在進行第二批更改時出現了錯誤 那么您可以回滾至保存點 使您的第一批更改原封不動 使用OracleTransaction對象需要注意的幾點 )你需要在你整個事務執行中只能有唯一OracleConnection OracleCommand
OracleTransaction 也就是說如果你事務處理過程中如果需要與數據庫的操作都只能在這唯一的Command中執行 類似于:
imgCommand CommandText = sSQLimgCommand ExecuteNonQuery()或其他操作若你新建一個連接執行其他數據庫操作的話 整個事務過程就會拋出異常 )如果你需要在你SQL語句中加入參數 則你必須在你執行完提交或相關數據庫操作之后將其Command的參數清空 下邊舉一個實際的項目里的事務函數 事務函數 summary 保存熱點文本文件信息到數據庫 /summary Private Function SaveTextFile()Function SaveTextFile() As Boolean Dim sSQl As String sSQl = select type_id from sys_file_type where file_extname= TXT Try imgCommand CommandText = sSQl Dim typeID As Int = Convert ToInt (imgCommand ExecuteScalar()) 文件類型 讀取文本信息 Dim Textblob() As Byte = GetText() sSQl = insert into t_watch_textcontent(image_id text_content type_id) values(:imageid :textcontent :typeid) 增添SQL參數 Dim Param As OracleClient OracleParameter Param = New OracleClient OracleParameter( imageid sNewImageID) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( textcontent Textblob) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( typeid typeID) imgCommand Parameters Add(Param) 提交信息 imgCommand CommandText = sSQl If imgCommand ExecuteNonQuery() Then bResult = True 關鍵是這里 需要你手動清除參數 imgCommand Parameters Clear() End If Catch ex As Exception Me ExceptionMessage = ex bResult = False End Try Return bResult End Function lishixinzhi/Article/program/net/201311/12778
這兩天看了 g 的CONCEPT文檔的事務部分 發現 自治事務 還有一些以前沒有注意到的地方 這里簡單總結一下
這一篇簡單描述一下自治事務可以使用的位置
自治事務可以使用在以下的位置
存儲過程和函數;
本地過程和函數;
包;
對象方法;
匿名塊的最頂層
其中過程 函數和包中使用自治事務很常見 大部分自治事務的情況都屬于這種情況 由于對象相對使用的比較少 所以對象方法中的自治事務也是比較少見的 不過由于對象中的方法和包中的存儲過程 函數十分相似 所以這種情況也是情理之中的
剩下的兩種情況 是以前所不了解的 從來沒有想過對于本地過程和函數也是可以定義為自治事務的 不過本地過程定義為自治事務是十分方便的功能 使得過程中需要用到自治事務的功能時 不必再額外定義一個自治事務的存儲過程 只需要在當前的過程中定義一個自治的本地過程就可以了
一個簡單的例子如下
SQL?CREATE?TABLE?T_AUTO_TRANS?(ID?NUMBER ?NAME?VARCHAR ( ));
表已創建
SQL?CREATE?TABLE?T_LOG?(ID?NUMBER ?NAME?VARCHAR ( ));
表已創建
下面建立一個LOCAL PROCEDURE的自治事務的例子
SQL?DECLARE ?PRAGMA?AUTONOMOUS_TRANSACTION; ?BEGIN ?INSERT?INTO?T_LOG?VALUES?( ? AUTONOMOUS_TRANSACTION ); ?MIT; ?END; ?/
PL/SQL 過程已成功完成
SQL?SELECT?*?FROM?T_AUTO_TRANS; ID?NAME ? ?TEST SQL?SELECT?*?FROM?T_LOG; ID?NAME ? ?AUTONOMOUS_TRANSACTION ?AUTONOMOUS_TRANSACTION SQL?ROLLBACK;
回退已完成
SQL?SELECT?*?FROM?T_AUTO_TRANS;未選定行
SQL?SELECT?*?FROM?T_LOG; ID?NAME ? ?AUTONOMOUS_TRANSACTION ?AUTONOMOUS_TRANSACTION
lishixinzhi/Article/program/Oracle/201311/18742
oracle的事務是以session開始登錄后的第一條DML語句開始的,然后以DDL(drop,create,alter,rename等),TCL的rollback,commit,DCL(grant,revoke)結束。
當然你也可以手動設置事務屬性,如只讀事務或者順序事務:
set transaction read only
set transaction isolation level SERIALIZABLE