MySQL中有 MyISAM(5.5.8版之前) 和 InnoDB(5.5.8版开始)
因为只有InnoDB数据库引擎支持事务,所以才会引出隔离级别
概念:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
原子性(Atomicity)
: 要么全部成功要么全部失败。
一致性(Consistency)
:事务执行前和事务执行后,原本和数据库一致的数据,依然还一致。
隔离性(Isolation)
:事务与事务之间互不干扰。
持久性(Durability)
:事务一旦被提交了,那么对数据库中的数据的改变就是永久的。
流程图解释:事务A先查询张三年龄,随后事务B修改张三年龄,然后事务A又读取张三年龄,然后事务A提交事务,事务B回滚,那事务A第二次查出的数据就是错的,所以是脏读。
流程图解释:事务A先查询张三年龄,随后事务B修改张三年龄,然后之间提交了,然后事务A又读取张三年龄,读取两个不一样的数据。被称为不可重复读。
流程图解释:事务A先查询C表总数,随后事务B删除一条条记录,然后之间提交了,然后事务A又查询C表总数,两次总数不一样。称为幻读。
从上面可以看出脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误
① read uncommited(读取未提交内容) :在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)
② read committed(读取提交内容):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。可解决脏读
③ repeatable read(可重读):这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。可解决脏读、不可重复读
④ serializable (可串行化 ) :这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。
Mysql查看隔离级别
select @@global.tx_isolation #查看全局的隔离级别
SELECT @@tx_isolation #查看会话的隔离级别
show variables like 'tx_isolation' #查看会话的隔离级别
Mysql设置隔离级别
①设置全局隔离级别
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重读)
SERIALIZABLE(串行化)
set global transaction isolation level 隔离级别
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重读)
SERIALIZABLE(串行化)
set session transaction isolation level 隔离级别
READ-UNCOMMITTED(读未提交)
READ-COMMITTED(读已提交)
REPEATABLE-READ(可重读)
SERIALIZABLE(串行化)
transaction-isolation = 隔离级别