Innodb引擎的锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
事务的ACID
事务是为了实现业务上完整性而实现了,他可以由多条sql语句组成,这些语句要么全部成功,否则发生任何错误都将会回滚。事务具有4个属性。称为事务的ACID属性
原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。并且在操作数据的过程中,无论使用并行或者是串行的方式执行,得到的最后的结果应该是一致的。
隔离性(Isolation):隔离性是描述多个事务之间操作共同资源时如何处置的问题,选择哪一种隔离方式。数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
并发事务带来的问题
相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。
更新丢失(Lost Update):当两个事务同时更新一个数据时候,由于同时读取数据表中的数据,并且两个事务都以自己读到的数据为基础进行更新,在写入表时候,后写入的值会覆盖先写入的值,原本应该两次更新的操作丢失了一次。“更新丢失”通常应该是完全避免的,但不能单靠数据库控制器解决,而应该时应用层的责任。
脏读(Dirty Reads):一个事务读取到了另一个事务未提交的数据,该数据可能会发生回滚而失效。
不可重复读(Non-Repeatable Reads):一个事务执行时,前后使用相同的查询语句,第二次读取时发现数据被修改,两次读取到的数据不一致。
幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
不可重复读和幻读都是两次的查询结果不同,但是不可重复读是倾向于行数据被修改,这个更好解决,对该行加锁即可。而幻读强调的是执行相同的查询时增加或者删除了一整行的数据。处理这个问题锁单行是无法解决的,需要通过锁表实现。这也是两个问题分开提出的原因。
事务的隔离级别
上面的问题在所有关系型数据中都是存在,所以在ISO/ANSI SQL92标准中定义了4个事务隔离级别来分别解决以上的问题。
隔离级别
脏读
不可重复读
幻读
读未提交
存在
存在
存在
读已提交
解决
存在
存在
可重复读
解决
解决
存在
序列化
解决
解决
解决
MySQL的隔离级别的