1、场景
在高并发的场景下(例如像商品扣库存的操作)很容易出现各种问题。
这种情况下,有些人会选择利用事务去解决。下面说说事务的不同的隔离性会出现各种不同的问题。
2、事务
事务共有四大特性,分别是原子性、一致性、隔离性、持久性。
就简单说说隔离性吧。隔离性分为读未提交、读已提交、可重复读、串行化
1)读未提交:
两个事务A、B开启,去操作同一条数据,A将这条数据修改了,但是还没有commit。B去查询这条数据,查询到的是A已经修改了的这条数据,B查询到结果以后A发现数据有问题,将事务回滚了,B再去根据这条查出来的数据进行业务处理。就会出现脏读的问题。
2)读已提交:
两个事务A、B开启,A事务先查询了一条数据,B事务在A查询之后将这条数据更新了一下,A事务在事务结尾的时候又查询了一次这条数据。造成了一条数据在一个事务里面不一致。这是不可重复读的问题。
3)可重复读
两个事务A、B开启,A去查询数据,查询的条件是id between 1 and
10.但是数据库里面只有1,3,5,7,9的数据。所以A查出来的只有五条记录。但是B在事务中将2,4,6,8,10的数据插入到数据库里面了,还没提交,这也就是A为什么只查出5条记录。这就是幻读。
4)串行化
事务所有的操作都会对数据进行锁死,隔离开来。缺点是很慢很慢。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |