查询:
SELECT COUNT(online.account_id) cnt from online;
Run Code Online (Sandbox Code Playgroud)
但是在线表也被事件修改,因此我经常可以通过运行看到锁定show processlist.
MySQL中是否有任何语法可以使select语句不引起锁定?
而且我忘了在上面提到它是在MySQL奴隶数据库上.
我加入my.cnf:transaction-isolation = READ-UNCOMMITTED
奴隶后会遇到错误:
错误'无法进行二进制日志记录.消息:InnoDB中的事务级别"READ-UNCOMMITTED"对于查询的binlog模式"STATEMENT"不安全
那么,是否有兼容的方法来做到这一点?
Jon*_*son 157
找到一篇名为"MYSQL WITH NOLOCK"的文章
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
在MS SQL Server中,您将执行以下操作:
SELECT * FROM TABLE_NAME WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
和MYSQL等价
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
Run Code Online (Sandbox Code Playgroud)
编辑
Michael Mior建议如下(来自评论)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 23
如果表是InnoDB,请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - 它对SELECT使用一致读取(无锁定模式)"如果设置了innodb_locks_unsafe_for_binlog选项并且事务的隔离级别未设置为SERIALIZABLE,则不指定FOR UPDATE或LOCK IN SHARE MODE.因此,不会对从所选表中读取的行设置锁定.
zom*_*bat 13
您可能想阅读MySQL手册的这一页.表的锁定方式取决于表的类型.
MyISAM使用表锁来实现非常高的读取速度,但是如果你有一个UPDATE语句在等待,那么将来的SELECTS将在UPDATE后面排队.
InnoDB表使用行级锁定,并且您不会将整个表锁定在UPDATE后面.还有其他与InnoDB相关的锁定问题,但您可能会发现它符合您的需求.
| 归档时间: |
|
| 查看次数: |
197306 次 |
| 最近记录: |