2016-11-16 85 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;