如問題所述,是否有任何理由在事務中包裝只讀sql語句?明顯更新需要交易。是否有任何理由將數據庫事務用於只讀sql語句?
1
A
回答
2
你仍然需要在你操作的對象讀取鎖。您希望獲得一致的讀取,因此在讀取它們時應該不可能寫入相同的記錄...
如果您在單個事務中發出多個SELECT
語句,則還會生成多個讀取鎖。
SQL Server有這方面的一些好的文檔( 「讀鎖」 被稱爲共享鎖,有):
http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx
我敢肯定,MySQL的工作方式類似
1
是,如果重要的是數據在選擇語句運行時是一致的。例如,如果您要爲某個用戶獲取多個銀行帳戶的餘額,則不希望讀取的餘額值不一致。例如,如果發生這種情況:
隨着平衡值B1 = 10,B2 = 20
- 你的代碼讀取B1 = 10
- 事務TA1另一個DB客戶機上啓動
- TA1寫入B1至20 ,B2〜10
- TA1提交
- 你的代碼讀取B2 = 10
所以你現在認爲B1是10,B2是10,可以向用戶顯示,說10美元已經消失了!
交易閱讀會防止這種情況,因爲我們將讀B2如在步驟5 20(假設一個多版本併發控制DB,其MySQL的+ innodb的是)。
0
MySQL 5.1中,與InnoDB引擎具有默認事務隔離級別這是重複的讀取。所以,如果你執行你的選擇事務內部沒有髒讀或不可重複讀可能發生。這意味着即使您的兩個查詢之間的事務提交,您也會始終獲得一致的數據庫。在理論上可重複的閱讀中,你只有恐懼幻影讀取,但與innodb這甚至不會發生。 因此,通過簡單地打開一個交易,你可以假設數據庫一致性(一致性)和不擔心並行運行和停止的寫事務執行儘可能多的選擇,只要你想。
你有沒有在具有這樣大的一致性約束有興趣嗎?那麼這取決於你對你的查詢做什麼。有不一致的讀取意味着,如果您的查詢的一個是基於結果從以前的一個,你可能有問題:
- 如果你只執行你不在乎一個查詢,在所有
- 如果沒有您查詢的假設從以前的一個結果,不關心
- 如果你從來沒有重新讀取在同一會話的記錄,同樣的事情
- 如果你總是讀你的主記錄的依賴在同一個查詢和做不使用延遲加載,沒問題
- 如果你的第一個和第一個之間有小的不一致ast查詢不會破壞你的代碼,然後忘掉它。但要小心,這可能會很難調試應用程序錯誤(並且很難重現)。因此,獲得一個健壯的應用程序代碼,這可能可能會處理數據庫錯誤並在發生這種情況時很好地(甚至不會崩潰)(一年2次?)。
- 如果你表現出關鍵數據(我的意思是銀行賬戶,而不是博客或聊天),那麼你也許應該關心它
- 如果你有很多寫操作的,那麼你就增加了不一致的風險讀取,您可能需要至少在一些關鍵點上添加交易
- 您可能需要測試對性能的影響,在事務中具有所有讀取請求時,當幾個寫入事務真的改變數據時,肯定會減慢引擎,他需要處理多個版本的數據。所以你應該仔細檢查一下,如果你的應用程序的影響不是太大
相關問題
- 1. 是否有任何理由不能在SQL Server中選擇語句?
- 2. 是否有任何用於將SQL語句轉換爲LINQ的開源軟件?
- 3. 在MFC/C++中是否有任何數據庫事務機制?
- 4. 是否有任何理由Object.freeze函數?
- 5. 確定SQL語句是否將數據庫寫入Qt中
- 6. 只讀數據庫訪問事務?
- 7. 是否有任何理由使用ObjectContext事務處理與DbContext的SaveChanges?
- 8. 是否有任何理由使用[:over @:?
- 9. 是否有任何理由使用isset()?
- 10. 是否有任何理由使用System.Uri?
- 11. 是否有SQL Select語句
- 12. 是否有任何理由使用ActiveRecord的數據庫連接池?
- 13. 是否有任何理由不在生產數據庫上使用Rails遷移?
- 14. UPDATE語句是否有任何限制?
- 15. SQL Server數據庫是隻讀錯誤
- 16. 是否有任何單個的sql語句用於批量更新?
- 17. 如何恢復只有事務日誌的SQL Server數據庫?
- 18. 是否有任何理由不依賴於業務邏輯中的數據庫密鑰完整性?
- 19. 是否有可能將所有管理數據庫讀取路由到一個從屬數據庫?
- 20. SQL語句從數據庫
- 21. 如何區分修改數據的SQL語句和只讀的語句?
- 22. ADO.NET SQL事務 - 只有1個調用數據庫?
- 23. 是否有任何理由在Android中使用support.v4庫?
- 24. 是否有理由選擇只有一個條件的if語句?
- 25. SQL if語句用於搜索數據庫的where子句
- 26. 是否有任何理由在方括號之間寫入數據庫列?
- 27. 是否有充分的理由使用帶標籤的語句?
- 28. 是否有理由用python中的try語句來包裝kwargs.get()?
- 29. 是否可以使用SQL語句列出數據庫的所有表?
- 30. 是否有任何理由將引用留在AssemblyInfo.cs中的System.Runtime.CompilerServices?
這個問題對SQL Server提出同樣的問題,但我相信Mysql的原理是一樣的。 http://stackoverflow.com/questions/3085095/should-i-be-using-sql-transactions-while-reading-records –