2011-07-28 34 views

回答

2

你仍然需要在你操作的對象讀取鎖。您希望獲得一致的讀取,因此在讀取它們時應該不可能寫入相同的記錄...

如果您在單個事務中發出多個SELECT語句,則還會生成多個讀取鎖。

SQL Server有這方面的一些好的文檔( 「讀鎖」 被稱爲共享鎖,有):

http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

我敢肯定,MySQL的工作方式類似

1

是,如果重要的是數據在選擇語句運行時是一致的。例如,如果您要爲某個用戶獲取多個銀行帳戶的餘額,則不希望讀取的餘額值不一致。例如,如果發生這種情況:

隨着平衡值B1 = 10,B2 = 20

  1. 你的代碼讀取B1 = 10
  2. 事務TA1另一個DB客戶機上啓動
  3. TA1寫入B1至20 ,B2〜10
  4. TA1提交
  5. 你的代碼讀取B2 = 10

所以你現在認爲B1是10,B2是10,可以向用戶顯示,說10美元已經消失了!

交易閱讀會防止這種情況,因爲我們將讀B2如在步驟5 20(假設一個多版本併發控制DB,其MySQL的+ innodb的是)。

0

MySQL 5.1中,與InnoDB引擎具有默認事務隔離級別這是重複的讀取。所以,如果你執行你的選擇事務內部沒有髒讀不可重複讀可能發生。這意味着即使您的兩個查詢之間的事務提交,您也會始終獲得一致的數據庫。在理論上可重複的閱讀中,你只有恐懼幻影讀取,但與innodb這甚至不會發生。 因此,通過簡單地打開一個交易,你可以假設數據庫一致性(一致性)和不擔心並行運行和停止的寫事務執行儘可能多的選擇,只要你想。

你有沒有在具有這樣大的一致性約束有興趣嗎?那麼這取決於你對你的查詢做什麼。有不一致的讀取意味着,如果您的查詢的一個是基於結果從以前的一個,你可能有問題:

  • 如果你只執行你不在乎一個查詢,在所有
  • 如果沒有您查詢的假設從以前的一個結果,不關心
  • 如果你從來沒有重新讀取在同一會話的記錄,同樣的事情
  • 如果你總是讀你的主記錄的依賴在同一個查詢和做不使用延遲加載,沒問題
  • 如果你的第一個和第一個之間有小的不一致ast查詢不會破壞你的代碼,然後忘掉它。但要小心,這可能會很難調試應用程序錯誤(並且很難重現)。因此,獲得一個健壯的應用程序代碼,這可能可能會處理數據庫錯誤並在發生這種情況時很好地(甚至不會崩潰)(一年2次?)。
  • 如果你表現出關鍵數據(我的意思是銀行賬戶,而不是博客或聊天),那麼你也許應該關心它
  • 如果你有很多寫操作的,那麼你就增加了不一致的風險讀取,您可能需要至少在一些關鍵點上添加交易
  • 您可能需要測試對性能的影響,在事務中具有所有讀取請求時,當幾個寫入事務真的改變數據時,肯定會減慢引擎,他需要處理多個版本的數據。所以你應該仔細檢查一下,如果你的應用程序的影響不是太大
相關問題