2013-02-11 25 views
2

我想模擬使用java的數據庫恢復子系統。但是,我有以下問題。END事務和COMMIT事務之間的區別

每當開始交易發佈時,是否總是有必要進行結束交易? (就像下面的例子)

b1 --- Begin txn 1 
r1(X) --- Read item X using txn 1 
e1 --- End txn 1 

根據上面的例子,我沒有發出Commit事務語句。那麼,我的交易會成功還是失敗?如果上面的例子如下,

b1 --- Begin txn 1 
r1(X) --- Read item X using txn 1 
c1 --- commit txn 1 

end和commit有什麼區別?

如果您需要更多信息,請讓我知道。

+2

SQL Server(T-SQL)沒有命令'END TRANSACTION'。 – 2013-02-11 05:37:02

+0

標籤屬於標籤區域,而不是問題標題。 – 2013-02-11 07:42:42

回答

8

要麼你ROLLBACK一個交易或COMMIT交易。我希望你不會把它與BEGIN和END塊混淆,這不是一個交易,與Transaction at All無關。

我相信大多數數據庫....仍然以ROLL BACK或COMMIT結束。

希望這會有所幫助。

+0

感謝您的回覆。實際上,在我正在實現的數據庫子系統中,每當遇到END時,我都必須在該事務的日誌文件中寫入更改。在遇到COMMIT之後,應將實際更改寫入磁盤塊。 – Ramesh 2013-02-12 17:48:15

0

'結束'用於結束程序/功能。這個陳述被執行是很重要的。
'Commit'用於永久保存交易中的所有更改。
例如,您使用SQL語句創建或刪除了一個表,您需要提交這些更改。

在這裏閱讀更多關於提交聲明。
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm

+0

你錯了。事務不*結束*,它們要麼被提交要麼被回滾,[甚至在Oracle中](http://docs.oracle.com/cd/E11882_01/server.112/e10713/transact.htm#autoId7「事務概述控制(Oracle)「)(這也不是問題似乎瞄準的平臺)。 – 2013-02-11 07:10:45

+0

哦,我的壞,我的意思是這個過程。對不起,謝謝。 – 2013-02-11 07:40:25

0

對於從這樣的一個程序內部發出SQL事務,END語句直接關閉交易。意味着交易已經完成,沒有更多應該發生。 COMMIT語句實際上告訴數據庫您希望事務更改是永久的。

如果您處於「autocommit」模式,則不需要COMMIT語句,因爲應該提交每個查詢/語句。

有關COMMIT的更多信息,請參閱here

如果您使用ODBC進行數據庫連接,則可以找到關於事務管理的信息here

另外這個question已經被問過。

+0

我想模擬一個數據庫恢復子系統。因此,用戶事務以開始,讀取,寫入,結束,提交和放棄的形式給出。我必須爲每個這些用戶事務編寫一個算法。我不確定要寫什麼來作爲「結束」的算法。我覺得沒有用戶發佈的「結束」,因爲用戶正在發出「提交」或「中止」。所以,我想知道是否真的需要「結束」。 – Ramesh 2013-02-11 06:22:12

-1

請參閱本LINK的細節

QUOTE: BEGIN TRANS和END TRANS開始和結束交易。他們不指定一個新的代碼塊;他們只標記交易界限。

1

BEGIN/END劃定了一段代碼,而不控制事務。如果不在事務內部,則每個語句都將在自治事務中執行。通常BEGIN/END與分支/循環指令(IF/WHILE)一起使用。

BEGIN TRANSACTION/COMMIT TRANSACTION表示事務的開始:此塊中每條語句都在同一事務中執行的,不能提交或回滾獨立。

0

開始和結束事務的確切命令名取決於您使用的特定數據庫(不幸)。

例如:

SQLite,您使用開始/ BEGIN TRANSACTION開始,和END/END TRANSACTION/COMMIT/COMMIT TRANSACTION結束事務。

MySQL中,您使用START TRANSACTION/BEGIN/BEGIN WORK和COMMIT/COMMIT WORK進行相同操作。

相關問題