2012-03-26 67 views
2

我有一個小問題(缺乏更好的單詞)與MySQL數據庫。我正在使用Python。 所以我有這個表中定期插入行。通常爲1行/秒。 我一起運行兩個Python腳本。一個以1行/秒模擬插入。我也關閉了自動提交併明確提交了一些行後,比如說10。Python MySQL-查詢被意外緩存

另一個腳本是對錶的簡單「SELECT count(*)...」查詢。此查詢不顯示錶格當前具有的行數。當腳本開始運行時,它固執地停留在表中最初的任何行數上。我甚至試過「SELECT SQL_NO_CACHE count(*)...」沒有任何效果。

任何幫助,將不勝感激。

+2

向我們顯示代碼。 – 2012-03-26 03:41:19

+0

如果您通過mysql控制檯直接查詢數據庫,您是否可以看到插入內容? – 2012-03-26 03:42:52

+0

@ learningJava - 是的。從MySQL控制檯查詢數據庫時,我可以看到插入。 – Sandman 2012-03-26 03:51:59

回答

1

如果在閱讀器中關閉了自動提交,那麼它將執行事務內的讀取操作,從而不會看到其他腳本正在執行的寫操作。

+0

@ KernelM-這有效。 Python MySQL API會自動將自動提交變爲False。我將autocommit設置爲true,它工作。非常感謝! – Sandman 2012-03-26 13:01:09

0

我的猜測是,無論是讀者還是作者(很可能是作者)都在未提交的事務中操作。嘗試確保作者在每次寫入之後進行提交,並嘗試從閱讀器中獲取ROLLBACK以確保它不在事務中。

+0

KernelM解決問題的方法奏效。即使在閱讀器中,如果必須讀取作者正在製作的插頁,似乎自動提交也必須設置爲真! 非常感謝您的回覆! – Sandman 2012-03-26 13:03:25

1

我的猜測是你使用INNODB和REPEATABLE READ隔離模式。嘗試隔離模式設置爲READ COMMITTED:每次

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 

另一種方式是開始一個新的事務,你執行select查詢。 Read more here

+0

這也是我的懷疑。 – 2012-03-26 11:18:21

+0

@Dikei我嘗試了你的解決方案。我在開始任何插入操作之前,從執行插入操作的腳本中執行了這條sql語句。我希望那是你的意思。這並沒有解決問題。我仍然無法閱讀作者從我的閱讀器腳本中製作的插入內容。但是KernelM的解決方案起作用了。我必須在閱讀器中將autocommit設置爲true以便能夠讀取插入。他在回答中提到了這種情況發生的原因。 非常感謝您的回覆! – Sandman 2012-03-26 13:11:14

+0

你必須在'select'腳本中設置:) – Dikei 2012-03-26 13:30:14