2016-11-16 55 views
4

我有一個讀取和更新(在2個不同的表中)的mysql proc。爲了確保讀取速度很快,我將隔離級別更改爲「未提交讀取」。髒讀是好的,數據一致性並不重要。但它看起來在讀取未提交隔離級別,更新非常緩慢 - 實際上它會影響我的表中的其他寫入。mysql中寫入操作中事務隔離的影響

我的代碼看起來像這樣

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

SELECT ParentId INTO @ParentId FROM TableA where Id = var_ID; 



UPDATE TableB SET Counter = Counter + 1 where Id = @ParentId; 

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 

我是在假設的隔離級別的影響只能讀,不能寫。在包含Set Session ....語句之後,我的數據庫性能急劇下降。 TableB上的所有寫操作需要1-2秒,而之前的100ms(Table有5M-8M個記錄)爲<。

任何人都可以幫助一些指向它?

我發現類似的問題在這裏,但未能得到答案

Read Uncommitted Isolation Level Impact On Insert/Update Transactions

+0

沒有直接關係,但有一個紅色標誌,在這裏:'與用戶選擇INTO'如果WHERE子句匹配0行,則定義變量(以'@'爲前綴)[導致意外行爲](http://dba.stackexchange.com/a/35207/11651)。你期望變量是'NULL',但不一定是。 –

+0

嗨@ Michael-sqlbot:謝謝,我已經在腳本中將它設置爲Null(雖然未複製)。當在where子句中使用前綴爲@的變量時注意到,索引未被使用。我認爲這是與數據類型的列和變量必須相同。我chaged變量類型Declare var_ParentId CHAR(36),它的工作 – Shyam

回答

0

嘗試

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

SELECT ParentId INTO @ParentId FROM TableA where Id = var_ID; 



UPDATE TableB SET Counter = Counter + 2 where Id = @ParentId; 

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;