浅谈Mysql的事务隔离级别

140 阅读4分钟

浅谈Mysql的事务隔离级别

一.事务的基本要素(ACID)

·原子性(Atomicity) 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节,事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

·一致性(Consistency) 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没有收到。

·隔离性(Isolation) 同一时间,只允许一个事务请求同一数据,不同事务之间彼此没有任何干扰。比如A正在从一张银行卡总取钱,在A取钱的过程结束前,B不能向这张卡转账。

·持久性(Durability) 事务完成之后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二.数据库并发访问存在的问题

脏读
就是只当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

不可重复度
是指在一个事务中,多次读同一数据。在这个事务还没有结束的时候,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了一个事务内两次读到的数据是不一样的,因此称为是不可重复读(即不能读到相同的数据内容)。
--例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已修改。原始读取不可重复,如果只有在坐着全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

幻读
是指当事务不是独立执行时发生的一种现象,例如第一个事务第一一个表中的数据进行了修改,这种修改涉及到了表中的全部数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像是发生了幻觉一样。
--例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将为编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

三.数据库隔离级别

隔离机制:为解决解决事务并发问题,必须引入有效的隔离机制,而隔离机制必须通过锁来实现。

数据库事务的隔离级别有4个,由低到高依次是Read uncommitted,Read committed,Repeatable read,Serializable,这四个级别可以逐个解决脏读,不可重复度,幻读这几类问题。越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗越大,可并发性越低。

1.事务隔离级别为读提交时,写数据只会锁住相应的行。
2.事务隔离级别为可重复读时,如果没有检索条件有索引(包括主键索引)的时候,默认的加锁方式是next-key锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他的事务是不能在这个间隙插入记录的,这样可以防止幻读。
3.事务隔离级别为串行化,读写数据都会锁住整张表。
4.事务隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。