事务隔离是数据库处理的基础之一。隔离级别是在多个事务进行更改并同时执行查询时,对结果的性能、可靠性、一致性和可重现性进行微调的设置。
InnoDB提供了标准的四个事务隔离级别:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE。InnoDB的默认隔离级别是REPEATABLE READ。
四类数据库隔离级别和各自的并发副作用
Isolation Level | Dirty Read | Non Repeatable Read | Phantom |
---|---|---|---|
READ UNCOMMITTED | Yes | Yes | Yes |
READ COMMITTED | No | Yes | Yes |
REPEATABLE READ | No | No | Yes |
SERIALIZABLE | No | No | No |
四类隔离级别
-
READ UNCOMMITTED(读未提交)
即该事务可以读取其它事务已经修改但是没有提交的数据
读取到未提交的数据,也称之为脏读
-
READ COMMITTED(读已提交)
该事务只能读取其它事务已经修改并且提交的数据
-
REPEATABLE READ(可重复读)
该事务可以保证在事务期间,读到的数据是一样的,即可重复读
-
SERIALIZABLE(序列化)
序列化指数据库同一时间只能执行一个事务。此时数据库的并发 能力为1,很容易造成超时,一般情况下不会使用SERIALIZABLE作为数据库的隔离级别
三类并发副作用
-
Dirty Read(脏读)
脏读指的是,事务读到了其它事务已经修改但还没有提交的数据,如果此时正在修改该数据的事务进行回滚操作,那么当前事务读到的数据就是脏数据了
-
Non Repeatable Read(不可重复读)
不可重复读指的是在当前事务的执行期间,读取相同的数据,会得到不同的结果
-
Phantom(幻读)
幻读指的是下面这么一种情况,事务A打算对表里指定范围内的数据进行操作,事务A首先读取了该范围内的数据(假如有30行),然后事务B在当前表内添加了5行数据(且在A将要操作的范围内),然后事务A对指定范围内的数据进行更新操作,更新完之后再次查询时,发现却对35行数据进行了更新,这样就产生了幻读
在MySQL中设置数据库隔离级别:
set session transaction isolation level READ UNCOMMITTED
set session transaction isolation level READ COMMITTED
set session transaction isolation level REPEATABLE READ
set session transaction isolation level SERIALIZABLE
在MySQL中查看数据库隔离级别:
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
MySQL语句事务操作:
start transaction
select * from stocks
insert into stocks (stock) values (1000)
commit
start transaction
select * from stocks
update stocks set stock = 10 where id = 2
roolback
网友评论