MySQL事务隔离级别的理解

发布时间:2020/04/23 作者:天马行空 阅读(917)

事物的4个特性:
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

多个事物并发执行时可能出现的现象:
脏读:事物A中读取到了事物B已经修改,但是还没提交的数据,如果事物B回滚了,这些数据就是脏数据,称之为脏读。
不可重复读:事物A中相同的条件查询数据,多次查询出来的值不一样,原因是事物B在两次查询的中间修改了数据。
幻读:事物A中相同的条件查询数据,多次查询出来的数据条数不一样,原因是事物B在两次查询的中间添加或者删除了数据。
不可重复读与幻读表现出来的都是查询结果不一致,一个侧重的是值被修改,一个侧重的是数据条数发生了变化;解决不可重复读需要锁住满足条件的记录,解决幻读需要锁表

事物的4个隔离级别:
Read Uncommitted(读取未提交内容):
该隔离级别,所有事务都可以看到其他未提交事务的执行结果。容易产生脏读,基本无用。
Read Committed(读取提交内容):
大多数数据库的默认事务隔离级别,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
Repeatable Read(可重读):
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
Serializable(串行化):
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

四种隔离级别,分别有可能产生问题如下所示:

shiwu-300x96.jpg

关键字mysql