似乎mysql select content (而不是count)查询总是至少在myisam表上有一个表读锁,在innodb表上有一个行读锁。有没有办法在mysql中发出select内容查询(如果需要,我可以更改表类型),而不需要它获取任何锁?我不介意返回的数据是否不一致,因为我将使用它作为搜索索引。
发布于 2010-01-07 15:58:55
对于InnoDB,您可以通过将事务隔离级别设置为:READ UNCOMMITTED来实现这一点。
在此隔离级别中:
SELECT语句以非锁定方式执行,但可能使用行的早期版本。因此,使用这种隔离级别,这样的读取是不一致的。这也称为“脏读”。否则,此隔离级别的工作方式类似于读取已提交。
您可以更改MySQL选项文件中的默认事务隔离级别,也可以为单个会话启用和禁用该级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM table_name;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;进一步阅读:MySQL Documentation: Set Transaction
发布于 2010-01-07 15:54:02
在没有锁表的情况下,myisam应该等同于读取未提交模式,但它实际上不支持任何事务类型...
innodb默认运行在“一致读取”模式(“可重复读取”隔离级别),文档建议不会锁定:
如果事务隔离级别是可重复读取(默认级别),则同一事务中的所有一致读取都将读取该事务中第一个此类读取所建立的快照
..。
一致读取是InnoDB处理SELECT语句的默认模式,在该模式中,SELECT语句处于read COMMITTED和REPEATABLE READ隔离级别。一致读取不会在其访问的表上设置任何锁,因此其他会话可以在对表执行一致读取的同时自由地修改这些表。
..。
InnoDB对select in子句使用一致的读取,如INSERT INTO ...选择,更新...(SELECT),然后创建表格...如果设置了innodb_locks_unsafe_for_binlog选项并且事务的隔离级别未设置为SERIALIZABLE,请选择不指定FOR UPDATE或LOCK IN SHARE模式。因此,不会对从所选表读取的行设置锁。
http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html
https://stackoverflow.com/questions/2018935
复制相似问题