回答
是,在事務內部的人可以看到其他先前的插入/更新/刪除語句是事務所作出的更改,則交易不能外SELECT語句....
如果你問關於隔離級別是什麼,然後理解 - 所有選擇語句(嘿,所有類型的語句), - 在事務中是。明確地在交易中的一個和站在它自己的交易之間的唯一區別在於,獨自站立的交易在其執行之前立即開始交易,並且在執行之後立即提交或回滾,
而事務中的顯式地可以(因爲它具有Begin Transaction語句)可以在該Select事件之前或之後發生在同一個事務中發生的其他語句(插入/更新/刪除,無論)。
因此,無論隔離級別設置爲何,這兩個選擇(在顯式事務內部或外部)都將處於正在該隔離級別上運行的事務中。
加法: 以下是針對SQL Server,但所有數據庫必須以相同的方式工作。在SQL Server中,查詢處理器始終處於3種交易模式之一,AutoCommit,隱式或明確。
AutoCommit是SQL Server數據庫引擎的默認事務管理模式。 ..每個Transact-SQL語句在完成時都已提交或回滾。 ...如果一個語句成功完成,它將被提交;如果遇到任何錯誤,則會回滾。這是默認設置,並且是在評論中@ Alex的問題的答案。
在Implicit Transaction模式,」 ......當前事務被提交或回滾後的SQL Server數據庫引擎自動啓動一個新的事務你什麼都不做劃定一個事務的開始。你只提交或隱式事務模式生成連續的事務鏈......「請注意,斜體代碼片段針對每個事務,無論是單個事務還是多個事務。
當您使用BEGIN TRANSACTION
聲明明確啓動事務時,引擎被置於Explicit Transaction模式。然後,每個語句都在該事務中執行,直到您明確終止事務(使用COMMIT
或ROLLBACK
)或者發生導致引擎終止和回滾的故障。
READ COMMITTED隔離級別是關於已寫入的記錄。它與這個select語句是否在事務中無關(除了在同一事務中寫入的那些事件)。
是的,有一點區別。對於MySQL,直到第一次查詢時,數據庫纔會真正以快照開頭。因此,重要的不是開始,而是交易中的第一個陳述。如果我做到以下幾點:
#Session 1
begin; select * from table;
#Session 2
delete * from table; #implicit autocommit
#Session 1
select * from table;
然後,我會得到同樣的事情在會話中的一個兩次(這是在表之前,我刪除了信息)。當我結束會話的事務(提交,開始或回滾)並再次檢查該會話時,表將顯示爲空。
對於MySQL InnoDB,你是絕對正確的 - 對於InnoDB READ COMMITTED隔離模式來保證一致的讀取。但是,在一般情況下,您可能會遇到不可重複的讀取,在這種情況下,可以歸結爲兩種情況(自動提交與待處理事務)能夠看到其他事務所做的修改,前提是這些更改已落實。 – 2009-12-29 20:33:22
如果你的數據庫(或者你的select語句中使用的所有表的底層存儲引擎)是事務性的,那麼就沒有辦法在「事務之外」執行它。
也許你的意思是「以自動提交模式運行它」,但這不同於「不交易」。在後一種情況下,它仍然在事務中運行,只是在您的語句被完成後,事務立即結束。
因此,在這兩種情況下,在運行期間,單個select語句將在READ COMMITTED級別與其他事務隔離。
現在這對於您的READ COMMITTED事務隔離級別意味着什麼:或許令人驚訝的是,沒有那麼多。
READ COMMITTED表示您可能遇到不可重複的讀取:在同一事務中運行多個select語句時,可能會在某個時間點選擇的行被修改並由另一個事務進行合併。稍後在相同的掛起事務中重新執行select語句時,您將能夠看到這些更改。在自動提交模式下,這2個選擇語句將在他們自己的事務中執行。如果另一個事務會修改並提交第一次選擇的行,那麼當您第二次執行該語句時,您將能夠看到這些更改。
- 1. select語句之外的SQL - IIF子句?
- 2. SELECT語句之前的ORDER?
- 3. select語句在另一個select語句中的字段 - oracle
- 4. 2 select語句之間的tsql UNION
- 5. Return和Break之間的區別語句
- 6. 'wait'和'@'語句之間的區別
- 7. 語句和函數之間的區別
- 8. 函數和語句之間的區別
- 9. Sqlite select語句在另一個select語句中
- 10. 返回行的特定範圍之間,有一個select語句
- 11. 簡單語句和複雜語句之間的區別 - Javascript
- 12. SQL:在一個SELECT語句
- 13. 在SELECT語句
- 14. 在Select語句
- 15. 在SELECT語句
- 16. 在SELECT語句
- 17. 在SELECT語句
- 18. select(select語句)
- 19. Select select select語句
- 20. select語句意外
- 21. 在JavaScript中的if語句==和===之間有什麼區別?
- 22. 另一個SELECT語句內的SELECT語句
- 23. 如何在ADO.NET中的SELECT語句之後捕獲PRINT事件?
- 24. 在另一個select語句中使用select語句中選擇的字段?
- 25. SQL Server事務和SELECT語句
- 26. 在一個單一的select語句
- 27. 在SQL SELECT語句
- 28. 與case語句SELECT語句
- 29. 在使用Postgres和Hibernate(Grails)的select語句之後的空閒事務
- 30. java中select select語句
我想他是問有沒有區別:「select ...」和「start transaction; select ...; stop transaction;」 – tster 2009-12-29 20:21:21
很好說! – 2009-12-29 20:29:41
很好的回答。我在尋找這些信息 – Davita 2011-03-02 13:10:44