任何方式select,而不会导致在MySQLlocking?

查询:

SELECT COUNT(online.account_id) cnt from online; 

但是在线表也是由一个事件修改的,所以我经常可以通过运行show processlist来看到锁。

MySQL中是否有语法可以使select语句不会导致锁?

而且我忘了在上面提到它在MySQL从数据库上。

在我添加到my.cnf:transaction-isolation = READ-UNCOMMITTED从属会遇到错误:

  Error 'Binary logging not possible. Message: Transaction level 'READ-UNCOMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'' on query 

那么,有没有兼容的方法来做到这一点?

发现了一篇题为“MYSQL WITH NOLOCK”的文章

https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx

在MSSQL中,您可以执行以下操作:

 SELECT * FROM TABLE_NAME WITH (nolock) 

和MYSQL是等价的

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

编辑

迈克尔·迈尔 ( Michael Mior)build议如下(来自评论)

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; COMMIT ; 

如果表是InnoDB,请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html – 它使用一致性读取(非locking模式)的SELECTs“如果设置了innodb_locks_unsafe_for_binlog选项,并且事务的隔离级别没有设置为SERIALIZABLE,则不指定FOR UPDATE或LOCK IN SHARE MODE。因此,从所选表中读取的行不设置locking。

使用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

版本5.0文档在这里 。

版本5.1文档在这里 。

你可能想阅读MySQL手册的这个页面 。 表如何被locking取决于它是什么types的表。

MyISAM使用表锁实现非常高的读取速度,但是如果您有UPDATE语句在等待,则未来的SELECTS将在UPDATE之后排队。

InnoDB表使用行级locking,并且不会将整个表locking在UPDATE后面。 还有其他types的与InnoDB相关的locking问题,但您可能会发现它适合您的需求。

取决于你的表types,locking将执行不同的操作,但SELECT计数也是如此。 对于MyISAM表,简单的SELECT count(*)FROM表不应该locking表,因为它访问元数据来提取logging数。 Innodb将需要更长的时间,因为它必须抓取快照中的表来计算logging,但不应该导致locking。

您至less应该将concurrent_insert设置为1(默认值)。 然后,如果数据文件中没有“空位”来填充表,插入将被附加到文件中,SELECT和INSERT可以与MyISAM表同时发生。 请注意,删除一条logging会在数据文件中添加一个“间隙”,这个数据文件将会试图填充未来的插入和更新。

如果您很less删除logging,则可以将concurrent_insert设置为2,并且插入将始终添加到数据文件的末尾。 然后select和插入可以同时发生,但无论您删除多lesslogging(除了所有logging),您的数据文件将永远不会变小。

底线,如果你有很多的更新,在表上插入和select,你应该使它InnoDB。 你可以自由地在一个系统中混合表types。

SELECTs通常不会在InnoDB表上做任何你关心的locking。 默认事务隔离级别意味着select不locking的东西。

当然争论还是会发生的。

从这个参考:

如果您使用LOCK TABLES显式获取表锁,则可以请求READ LOCAL锁而不是READ锁,以便在locking表时允许其他会话执行并发插入。

另一种在mysql中启用脏读的方式是添加提示:locking共享模式select*从TABLE_NAMElocking共享模式;