2016-05-30 75 views
1

我有一些InnoDB表和一個腳本來啓動一個事務。在這個事務中,一個表的不同行得到更新,其他行將被插入到另一個表中,並執行許多選擇。這必須可靠地發生,所以我使用具有REPEATABLE READ的默認事務作爲隔離級別。此交易可能需要一些時間。如果有交易正在進行,我該如何避免阻止選擇?

現在,當其他腳本(網頁請求)在同一時間得到執行,他們做了一些選擇的數據庫。不幸的是,這些選擇會等到事務從相同表中讀取後結束。所選數據可以是交易的更新數據,但也可以是其他數據。

此阻塞想什麼我避免。我想立即向用戶顯示網頁,不能等待交易(一兩秒鐘就可以接受,但交易有時會更長)。

那麼我該如何做選擇?我想這些數據可能並不總是準確的。但是這樣更好,然後讓用戶等待20秒。

我應該

  • 使用 'FOR UPDATE' 或 'SHARE模式鎖定' 在交易的選擇?
  • 使用另一個隔離級別?
  • 把閱讀選擇也在交易?
  • 做一些不同的事情?

我認爲這是一個非常普遍的要求,但我找不到一個簡單的答案呢。

注:接下來的事情將是確保併發寫入事務。但現在我只想確保在事務處理期間至少平行讀取不會被阻塞。

+0

@iLikeMySql你是什麼意思?我只看到交易以外的選擇正在等待,直到交易完成。該事務使用UPDATE,INSERT和SELECT語句。 – robsch

回答

0

好吧,這是不是一個真正的答案,但我想我應該告訴我已經找到了:

它沒有有什麼關係與MySQL的行爲,我猜。它實際上是懸掛PHP請求。也就是說,當第一個PHP調用開始了長期的正在進行的事務時,進一步的PHP調用其他頁面已被掛起。他們之所以被絞死,是因爲第一次請求鎖定了會話session_start()沒有工作了。當第一個請求完成(或超時)時,進一步的請求將再次運行。

由於長事務PHP呼叫也沒必要寫東西到我剛剛關閉這個調用與session_write_close()會話的會話。現在,更多的請求不再掛起。

This是對我的暗示。

結論:數據庫選擇未被阻止。