INNODB事务和锁
事务及其ACID属性
事务是由一组SQL语句组成的逻辑处理单元。
事务具有以下4个特性,简称为事务ACID属性。
原子性(Atomicity)
事务是一个原子操作单元,其对数据的修改,要么全部成功,要么全部失败。
一致性(Consistent)
在事务开始和完成时,数据都必须保持一致状态。
隔离性(Isolation)
数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的 “独立” 环境下运行。
持久性(Durable)
事务完成之后,对于数据的修改是永久的。
并发事务处理带来的问题
脏读(Dirty Reads)
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例子:事务三中售出一张票,修改了数据库16变15,可是事务还没提交,事务一读了修改了的数据(15),但是事务三被中断撤销了,比如存钱修改数据库后,在返回数据给客户时出现异常,那么事务三就是不成功的,数据会变回16。可是事务一读了一个不正确的数据。
不可重复读(NonRepeatable Reads)
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现和以前读出的数据不一致。
例子:事务一读取后,事务三对16张票修改,可是事务一中,有再次读这张票的SQL语句,那么事务一得到的跟第一次不同的值(16张票就可能变成15张了)。
幻读(Phantom Reads)
一个事务按照相同的查询条件重新读取以前查询过的数据,却发现其他事务插入了满足其查询条件的新数据。
例子:事务一按一定条件读取16,但是后面还有一些步骤需要再次读取此数据校验,所以没提交事务,可这个时候事务三(16变15)执行成功,卖出了票。那当事务一再次读的时候,就读到了15。这样读到的数据就不是最新的了。
事务隔离级别
为了解决上述提到的事务并发问题,数据库提供一定的事务隔离机制来解决这个问题。
数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使用事务在一定程度上“串行化” 进行,这显然与“并发” 是矛盾的。
数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏写、脏读、不可重复读、幻读这几类问题。
![](https://img.haomeiwen.com/i10201480/029d9815f44471f4.png)
Read committed,解决脏读;
解决方式:读已提交的数据行;
Repeatable read,解决不可重复读;
在事务读取时,加行锁;
Serializable,解决幻读;
在事务读取时,加表锁;