2009-12-29 66 views

回答

54

是,在事務內部的人可以看到其他先前的插入/更新/刪除語句事務所作出的更改,則交易不能外SELECT語句....

如果你問關於隔離級別是什麼,然後理解 - 所有選擇語句(嘿,所有類型的語句), - 在事務中是。明確地在交易中的一個和站在它自己的交易之間的唯一區別在於,獨自站立的交易在其執行之前立即開始交易,並且在執行之後立即提交或回滾,

而事務中的顯式地可以(因爲它具有Begin Transaction語句)可以在該Select事件之前或之後發生在同一個事務中發生的其他語句(插入/更新/刪除,無論)。

因此,無論隔離級別設置爲何,這兩個選擇(在顯式事務內部或外部)都將處於正在該隔離級別上運行的事務中。

加法: 以下是針對SQL Server,但所有數據庫必須以相同的方式工作。在SQL Server中,查詢處理器始終處於3種交易模式之一,AutoCommit,隱式明確

AutoCommit是SQL Server數據庫引擎的默認事務管理模式。 ..每個Transact-SQL語句在完成時都已提交或回滾。 ...如果一個語句成功完成,它將被提交;如果遇到任何錯誤,則會回滾。這是默認設置,並且是在評論中@ Alex的問題的答案。

Implicit Transaction模式,」 ......當前事務被提交或回滾後的SQL Server數據庫引擎自動啓動一個新的事務你什麼都不做劃定一個事務的開始。你只提交或隱式事務模式生成連續的事務鏈......「請注意,斜體代碼片段針對每個事務,無論是單個事務還是多個事務。

當您使用BEGIN TRANSACTION聲明明確啓動事務時,引擎被置於Explicit Transaction模式。然後,每個語句都在該事務中執行,直到您明確終止事務(使用COMMITROLLBACK)或者發生導致引擎終止和回滾的故障。

+1

我想他是問有沒有區別:「select ...」和「start transaction; select ...; stop transaction;」 – tster 2009-12-29 20:21:21

+0

很好說! – 2009-12-29 20:29:41

+0

很好的回答。我在尋找這些信息 – Davita 2011-03-02 13:10:44

2

READ COMMITTED隔離級別是關於已寫入的記錄。它與這個select語句是否在事務中無關(除了在同一事務中寫入的那些事件)。

5

是的,有一點區別。對於MySQL,直到第一次查詢時,數據庫纔會真正以快照開頭。因此,重要的不是開始,而是交易中的第一個陳述。如果我做到以下幾點:

#Session 1 
begin; select * from table; 

#Session 2 
delete * from table; #implicit autocommit 

#Session 1 
select * from table; 

然後,我會得到同樣的事情在會話中的一個兩次(這是在表之前,我刪除了信息)。當我結束會話的事務(提交,開始或回滾)並再次檢查該會話時,表將顯示爲空。

+1

對於MySQL InnoDB,你是絕對正確的 - 對於InnoDB READ COMMITTED隔離模式來保證一致的讀取。但是,在一般情況下,您可能會遇到不可重複的讀取,在這種情況下,可以歸結爲兩種情況(自動提交與待處理事務)能夠看到其他事務所做的修改,前提是這些更改已落實。 – 2009-12-29 20:33:22

3

如果你的數據庫(或者你的select語句中使用的所有表的底層存儲引擎)是事務性的,那麼就沒有辦法在「事務之外」執行它。

也許你的意思是「以自動提交模式運行它」,但這不同於「不交易」。在後一種情況下,它仍然在事務中運行,只是在您的語句被完成後,事務立即結束。

因此,在這兩種情況下,在運行期間,單個select語句將在READ COMMITTED級別與其他事務隔離。

現在這對於您的READ COMMITTED事務隔離級別意味着什麼:或許令人驚訝的是,沒有那麼多。

READ COMMITTED表示您可能遇到不可重複的讀取:在同一事務中運行多個select語句時,可能會在某個時間點選擇的行被修改並由另一個事務進行合併。稍後在相同的掛起事務中重新執行select語句時,您將能夠看到這些更改。在自動提交模式下,這2個選擇語句將在他們自己的事務中執行。如果另一個事務會修改並提交第一次選擇的行,那麼當您第二次執行該語句時,您將能夠看到這些更改。