MySQL中有 MyISAM(5.5.8版之前) 和 InnoDB(5.5.8版开始)
因为只有InnoDB数据库引擎支持事务,所以才会引出隔离级别
事务
概念:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务的四种特性(ACID)
原子性(Atomicity)
: 要么全部成功要么全部失败。
一致性(Consistency)
:事务执行前和事务执行后数据总量不变
隔离性(Isolation)
:事务与事务之间互不干扰。
持久性(Durability)
:事务一旦被提交了,那么对数据库中的数据的改变就是永久的。
脏读、不可重复读、幻读
- 脏读:脏读也俗称“读未提交”,顾名思义,就是某一事务A读取到了事务B未提交的数据。
流程图解释:事务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 隔离级别
③通过配置文件设置隔离级别(打开“mysql.ini”文件,添加“transaction-isolation=事务级别”语句即可)
READ-UNCOMMITTED(读未提交)
READ-COMMITTED(读已提交)
REPEATABLE-READ(可重读)
SERIALIZABLE(串行化)
transaction-isolation = 隔离级别