BeginTrans用于開始一個事物;RollbackTrans用于回滾事務(wù);CommitTrans用于提交所有的事務(wù)處理結(jié)果,即確認(rèn)事務(wù)的處理
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),同心網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:同心等地區(qū)。同心做網(wǎng)站價格咨詢:18982081108
BeginTrans和CommitTrans 用于標(biāo)記事務(wù)的開始和結(jié)束,在這兩個之間的語句,就是作為事務(wù)處理的語句
事務(wù)是為了實(shí)現(xiàn)數(shù)據(jù)的一致性和并發(fā)處理,你對數(shù)據(jù)進(jìn)行定義和修改時就會產(chǎn)生事務(wù)。
例如你執(zhí)行update語句,這時事務(wù)就開始了,執(zhí)行commit會提交事務(wù),而rollback會回滾(撤銷)事務(wù)。如果你什么也不做,那么正常退出程序時會自動提交,而程序異常中止則會回滾事務(wù)。
當(dāng)然不是了,在Oracle中,只有DML才會開啟一個事務(wù)。也就是說Insert,Update,Delete這些都會開啟一個事務(wù),并且該事務(wù)在commit/rollback/ddl命令時會自動結(jié)束。
其他的,像查詢語句Select(不包含F(xiàn)or Update等語句)時,是不會開啟一個事務(wù)的。
補(bǔ)充:
首先有一點(diǎn)非常抱歉,上次的回答中誤將DML寫成了DDL,可能這一點(diǎn)兒讓你誤解了。
“當(dāng)insert語句后會打開事務(wù),然后再來一個insert語句又會是一個新事物是嗎”這種說法是不正確的,第一個Insert沒有commit或者rollback的情況下,第二個Insert和第一個是屬于同一個事務(wù)的。因?yàn)镮nsert不屬于commit/rollback/ddl命令,而是屬于DML命令。
當(dāng)?shù)谝粋€Insert結(jié)束后,立即執(zhí)行一個新建表,刪除表等命令(DDL命令),則會結(jié)束當(dāng)前事務(wù)。
oracle使用語句savepoint sp_begintran開啟顯式事務(wù),鎖本身和事務(wù)是沒有關(guān)系的,只要是數(shù)據(jù)庫的操作都會產(chǎn)生鎖。處于事務(wù)中的SQL語句只有這個事務(wù)提交(commit)之后,事務(wù)中的SQL語句影響的表記錄上的鎖才會釋放。鎖常見有共享鎖(select語句產(chǎn)生)和排它鎖(DML語句產(chǎn)生),如果一個表上加載有共享鎖,還可以疊加共享鎖,但不能疊加排它鎖。如果一個表上加載有排他鎖,就什么鎖都不能加了,也就是說如果DML語句占用過多的時間,這些數(shù)據(jù)庫效率就不高,就需要優(yōu)化,當(dāng)然select語句性能低了也不行。
每個存儲過程可以不用顯式事務(wù),它本身就為你開啟了一個隱式事務(wù),如果需要開啟顯示事務(wù),就通過savepoint sp_begintran開啟,無論是不是顯式還是隱式事務(wù),你都得通過commit work提交事務(wù),通過exception捕捉SQL語句異常,在異常發(fā)生時需要回滾事務(wù)(rollback work)。
在C# 和 VB.NET 中使用數(shù)據(jù)庫事務(wù)您可以使用 OracleTransaction 類的一個對象來表示一個事務(wù)。OracleTransaction 類包含多個屬性,其中的兩個為 Connection(指定與事務(wù)關(guān)聯(lián)的數(shù)據(jù)庫連接)和 IsolationLevel(指定事務(wù)隔離級別);本文稍后將向您介紹更多有關(guān)事務(wù)隔離級別的內(nèi)容。 OracleTransaction 類包含許多操控事務(wù)的方法。您可以使用 Commit() 方法永久提交 SQL 語句,并可以使用 Rollback() 撤銷這些語句。您還可以使用 Save() 在事務(wù)中設(shè)置一個保存點(diǎn)。 我現(xiàn)在將帶著您逐步完成兩個示例程序 ― 一個用 C# 編寫 (TransExample1.cs),另一個用 VB.NET 編寫 (TransExample1.vb)。這些程序演示了如何執(zhí)行一個包含了兩條 INSERT 語句的事務(wù)。第一條 INSERT 語句將在表 product_types 中添加一行,第二條將在表 products 中添加一行。 導(dǎo)入命名空間以下C# 程序語句指定在程序中使用 System 和 Oracle.DataAcess.Client 命名空間: using System; using Oracle.DataAccess.Client;下面是等價的 VB.NET 語句: Imports System Imports Oracle.DataAccess.ClientOracle.DataAccess.Client 命名空間是 ODP.NET 的一部分,它包含許多類,其中有OracleConnection、OracleCommand 和 OracleTransaction。示例程序用到了這些類。 第1 步 創(chuàng)建一個 OracleConnection 對象連接到 Oracle 數(shù)據(jù)庫,然后打開該連接。 在C# 中: OracleConnection myOracleConnection = new OracleConnection( "User Id=store;Password=store;Data Source=ORCL" ); myOracleConnection.Open();在VB.NET 中: Dim myOracleConnection As New OracleConnection( _ "User Id=store;Password=store;Data Source=ORCL") myOracleConnection.Open()User Id 和 Password 屬性指定了您所要連接到的模式的數(shù)據(jù)庫用戶和口令。Data Source 屬性指定了數(shù)據(jù)庫的 Oracle Net 服務(wù)名稱;初始數(shù)據(jù)庫的默認(rèn)服務(wù)名稱為 ORCL。如果您使用的不是初始數(shù)據(jù)庫,或者您的服務(wù)名稱不同,那么您需要在程序中修改 Data Source 屬性的設(shè)置。 第2 步 創(chuàng)建一個 OracleTransaction 對象,然后調(diào)用 OracleConnection 對象的 BeginTransaction() 方法啟動事務(wù)。 在C# 中: OracleTransaction myOracleTransaction = myOracleConnection.BeginTransaction(); In VB.NET: Dim myOracleTransaction As OracleTransaction = _ myOracleConnection.BeginTransaction()第3 步 創(chuàng)建一個 OracleCommand 對象,用于存儲 SQL 語句。 在C# 中: OracleCommand myOracleCommand = myOracleConnection.CreateCommand();在VB.NET 中: Dim myOracleCommand As OracleCommand = myOracleConnection.CreateCommand因?yàn)镺racleCommand 對象使用 OracleConnection 對象的 CreateCommand() 方法創(chuàng)建的,所以它自動使用在第 2 步中為 OracleConnection 對象設(shè)置的事務(wù)。 第4 步 將OracleCommand 對象的 CommandText 屬性設(shè)為向表 product_types 中添加一行的第一條 INSERT 語句。 在C# 中: myOracleCommand.CommandText = "INSERT INTO product_types (" + " product_type_id, name" + ") VALUES (" + " 3, 'Magazine'" + ")";在VB.NET 中: myOracleCommand.CommandText = _ "INSERT INTO product_types (" _ " product_type_id, name" _ ") VALUES (" _ " 3, 'Magazine'" _ ")"