假设我有两个用户试图按以下顺序访问数据库中名为"comments"的表:
-
User1正在制作和更新id为10 的记录
UPDATE comments SET comment="Hello World"WHERE id=10
-
User2正在为相同表注释的所有行进行选择
从评论中选择*
我想讨论以下情况之间的区别:
- 如果表的引擎是MyISAM:Update查询将锁定整个表,它将对选择查询进行排队,直到更新该行完成,然后将执行它,这将停止任何用户从该表中询问任何内容,直到更新完成
- 如果表的引擎是InnoDB:那么更新查询将锁定更新的行
我想知道这个锁是如何影响SELECT查询的???
我的意思是,如果select向数据库询问注释表的全部记录,并发现其中一条记录(id=10)被锁定,数据库是否会再次对select查询进行排队,直到更新完成?
如果是,那么这两个发动机之间的区别是什么??
如果不是,我想说的是,我的网站上也有同样的情况,甚至我把我的表引擎从MyISAM改为InnoDB,但当有更新或插入查询时,排队任何请求的问题仍然存在。
对这种情况的任何解释都会很有帮助。提前感谢
在InnoDB中,这取决于事务是否启用。InnoDB具有MVCC特性,这意味着当线程1正在更新时,线程2可以无锁读取。
这里已经回答了InnoDB';s行锁定与MVCC非阻塞读取相同?
如果事务被禁用,和MyISAM一样?我想是的,但不确定。
在您的场景中的Innodb中,结果将用于选择查询,但如果没有更新,则会使用id=10的行的旧数据。结果不会停止。