一、数据库事务的特征
ACID表示原子性(automicity)、一致性(consistency)、隔离性(isolation)、持久性(durablity)。一个运行良好的事务处理系统,必须具备上述标准特征。
原子性:
一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交,要么全部失败回滚。
一致性:
一致性指的是逻辑上的一致性,即所有操作都符合现实中期望的。
隔离性:
通常来说,一个事务所做的修改在最终提交前,对其他事务是不可见的。
持久性:
一旦事务提交,其所做的修改就会永久地保存到数据库中,即使此时系统崩溃,修改的数据也不会丢失。
注:mysql默认采用了自动提交(AUTOCOMMIT)模式。即不是显式地开始一个事务,则每个查询都被当做一个事务进行提交。在事务执行过程中随时都可以进行锁定,锁只有在执行COMMIT或者ROLLBACK的时候才会释放,并且所有的锁都是同一时刻释放的。mysql服务器层不管理事务,事务是由下层的存储引擎实现的。
在大部分情况下,InnoDB都是正确的选择,所以Oracle在MySQL 5.5版本时终于将InnoDB作为默认的存储引擎,其默认隔离级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。InnoDB表是基于聚簇索引建立的。
二、隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。
下面简单的介绍下四种隔离级别:
READ UNCOMMITED(未提交读)
在READ UNCOMMITED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。
READ COMMITED(提交读)
一个事务从开始直到提交之前所做的任何修改对其他事务都是不可见的。这个级别有时候也叫不可重复读。
REPEATED COMMITED(可重复读)
REPEATED COMMITED解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是可重复读隔离级别还是无法解决幻读的问题。幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题。可重复读是mysql的默认事务隔离级别。
SERIALIZABLE(可串行化)
SERABLIZABLE是最高的隔离级别,它通过强制事务串行执行,避免了前面所说的幻读问题。
三、死锁
死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定一个资源时也会产生死锁。
为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。InnoDB目前处理死锁的方法是:将持有最少行级排他锁的事务进行回滚。