事务并发
多事务并发执行的出现的问题
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
脏读:对于两个事务T1,T2。T1读取了T2更新但还未提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2。T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。
幻读(虚读):对于两个事务T1,T2。T1从一个表中读取一个字段时,T2在该表中插入了一些新的行。此时T1就会多出几行。
解决方法
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱.
通过设置隔离级别来解决并发问题
4、隔离级别
级别类型 | 级别名称 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
read uncommitted | 读未提交 | × | × | × |
read committed | 读已提交 | √ | × | × |
repeatable read | 可重复读 | √ | √ | × |
serializable | 串行化 | √ | √ | √ |
√表示:解决了这一问题;×则相反
实例演示
测试隔离级别为read uncommitted
1.打开命令行,进入mysql数据库,并查看数据库的隔离级别;
mysql8.0:select @@transaction_isolation;
其他版本自行百度
2.将隔离级别改为read uncommitted;
set session transaction isolation level read uncommitted;
3. 随意查看一个表(忽略里面的数据,我直接从copy老师给定数据库文件)(-_-)
4.开启一个事务并修改里面的任意一个值,不要提交事务
5.开启一个新的命令行,进入mysql数据库,并将隔离级别改为read uncommitted,查看修改后的表;
6.让第一个的命令行的事务回滚;并查看第二个命令行的beauty表;
我们可以看到beauty表中的数据有变回原来的数据了,注意:如果我们在第5步,也就是上一个事务没有回滚之前读取数据,这时我们读的数据就是脏数据
测试隔离级别为read committed
1.分别将两个命令行里的mysql隔离级别都改为read committed
2.查看beauty表中的数据
3.开启一个新事务,并修改表中的数据不要提交
4.在另一个命令行中查看beauty表
我们可以看到,这里我们读取的还是之前没有修改过的数据;因为read committed隔离级别下读取的是以提交的数据所以,read committed可以解决脏读的问题
注意:read committed并不能解决不可重复读的问题
因为这时,如果我们将第一个事务提交,第二个事务再次读取数据,则两次读的数据不一样
测试隔离级别为repeatable read
1.依上将隔离级别修改为repeatable read
2.开启事务,更改数据,另一个事务查看数据
第一个事务
第二个事务
我们可以看到这里解决了脏读和重复读的问题
接下来我们讨论一下幻读(虚读)
主要针对插入
session1 | session2 |
---|---|
set autocommit=0; | set autocommit=0; |
select * from beauty; | select * from beauty; |
insert into beauty values(…); | |
commit; | |
update beauty set sex = ‘男’; | |
commit; |
这里我们可以看到第一个事务执行
update beauty set sex = '男';
本应该影响12条记录,但是我们在执行update前,第二个事务执行了insert语句插入了一条数据;导致第一个事务出现了幻读;
所以repeatable read并不能解决幻读的问题
测试隔离级别为serializable
我们可以看到这里第二个事务在执行select语句时就进入了阻塞状态,无法取beauty表再进行任何操作(包括插入操作);
所以,serializable可以解决幻读的问题
各种数据库对事务隔离级别的支持
Oracle | Mysql | |
---|---|---|
READ UNCOMMITTED | × | √ |
READ COMMITTED | √(默认) | √ |
REPEATABLE READ | × | √(默认) |
SERIALIZABLE | √ | √ |