一、MySQL的隔离级别是什么?
1.事务的四个特征(ACID)
事务具有四个特征:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability),这四个特征简称为ACID。
1、原子性:事务中包含的各种操作要么都不做,要么都做。
2、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3、隔离性:一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
4、持久性:指一个事务一旦提交,它对数据库中的数据改变就应该是永久性的,接下来的其它操作或故障不应该对其执行结果有任何影响。
二、Mysql的四种隔离级别具体指哪些?
Read Uncommitted(读取未提交内容)
该隔离级别,所有事务都可以看到其它未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)
Read Committed(读取提交内容)
这是大多数据库系统默认的隔离级别,单不是MySql默认的。一个事务只能看见已经提交事务所做的改变,这种隔离级别也支持所谓的不可重复读。
Repeatable Read (可重读)
这是Mysql默认的事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。理论上会导致另一个问题:幻读(Phantom Read),幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再都读取该范围的数据行时,会发现有新的“幻影”行。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。它是在每个读的数据行上加上共享锁。在这个级别,可能会导致大量的超时现象和锁竞争。
出现问题
这四种隔离级别采用不同的锁类型来实现,若读取的是同一个数据的话,就同意发生问题。例如:
脏读(Drity Read): 某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个rollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中插入了一个事务更新的原有数据。
幻读(Phantom Read):在一个事务的连词查询中数据笔数不一致,
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示: