我知道MySQL中有一个问题是并发SELECT和INSERT.但是,我的问题是,如果我打开与MySQL的两个连接并继续使用它们加载数据,MySQL是否同时获取数据或在加载另一个之前等待一个完成?
我想知道MySQL在两种情况下的表现.就像当我尝试在打开单独的连接时同时在同一个表或不同的表中加载数据时.
sea*_*awk 10
但并发读/写的方法取决于您使用的存储引擎.
MySQL使用InnoDB表的行级锁定来支持多个会话的同时写访问,使其适用于多用户,高度并发和OLTP应用程序.
MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,一次只允许一个会话更新这些表,使它们更适合于只读,大多数读取或单用户应用程序
但是,上面提到的MyISAM表的行为可以通过concurrent_insert系统变量来改变,以实现并发写入.请参阅此链接了解详情.
因此,事实上,MySQL确实支持InnoDB和MyISAM存储引擎的并发插入.
您询问死锁检测,ACID和特殊MVCC,锁定和交易:
死锁检测和回滚
InnoDB自动检测事务死锁并回滚事务或事务以打破死锁.InnoDB尝试选择要回滚的小事务,其中事务的大小由插入,更新或删除的行数决定.当InnoDB执行事务的完全回滚时,将释放由事务设置的所有锁.但是,如果由于错误而仅回滚单个SQL语句,则可能会保留由该语句设置的某些锁定.发生这种情况是因为InnoDB以一种格式存储行锁,以至于后来无法知道哪个锁由哪个语句设置.
https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlock-detection.html
锁定
保护事务不被查看或更改其他事务正在查询或更改的数据的系统.锁定策略必须平衡数据库操作(ACID原理的原则)的可靠性和一致性与良好并发性所需的性能.微调锁定策略通常涉及选择隔离级别并确保所有数据库操作对于该隔离级别是安全可靠的.
http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_locking
酸
代表原子性,一致性,隔离性和耐久性的首字母缩略词.这些属性在数据库系统中都是可取的,并且都与事务的概念密切相关.InnoDB的事务功能遵循ACID原则.事务是可以提交或回滚的原子工作单元.当事务对数据库进行多次更改时,要么在提交事务时所有更改都成功,要么在事务回滚时撤消所有更改.数据库始终保持一致状态 - 每次提交或回滚后,以及事务正在进行中.如果跨多个表更新相关数据,查询将查看所有旧值或所有新值,而不是旧值和新值的混合.交易在进行过程中受到保护(隔离); 他们不能互相干扰或看到彼此未提交的数据.这种隔离是通过锁定机制实现的.经验丰富的用户可以调整隔离级别,在保证事务确实不会相互干扰的情况下,减少保护,转而提高性能和并发性.
http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_acid
MVCC
InnoDB是一个多版本并发控制(MVCC)存储引擎,这意味着单行的许多版本可以同时存在.事实上,可能存在大量此类行版本.根据您选择的隔离模式,InnoDB可能必须保持所有行版本返回到最早的活动读取视图,但至少它必须保持所有版本返回到当前正在运行的SELECT查询的开始
https://www.percona.com/blog/2014/12/17/innodbs-multi-versioning-handling-can-be-achilles-heel/