数据并发问题
数据的并发问题,是指一个数据库经多个客户端采用并发的方式访问而导致的各种并发问题。这些问题归结为5类,其中包括3类数据读问题;2类数据更新问题。
3类数据读问题:
脏读
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。
不可重复读
不可重复读指A事务读取B事务已经提交的更改数据。
幻象读
A事务读取了B事务提交的新增数据,这时A事务将出现幻象读的问题。
不可重复读与幻象读的区别主要有两点:
- B事务操作是不同。不可重复读,B事务操作是更新;幻象读对应的B事务操作是新增。
- 解决这两类问题,相应的方法不同。对于不同重复读,只需要解决被更新数据的读取问题。将读取的行数据进锁定—行级锁;对于幻象读,需要解决的是整张数据表的写入问题,数据库使用—表级锁进行解决。
2类数据更新问题
第一类更新丢失
A事务撤销时,把已经提交的B事务的更新数据覆盖了。
第二类更新丢失
A事务覆盖B事务已经提交的数据,造成B事务所作操作丢失。
解决方案–事务隔离级别
为了解决数据并发问题,数据库提供了行级锁与表级锁。但是两种锁使用太复杂。所以数据库系统为用户提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的sql语句,然后自动为事务操作的数据资源添加适合的锁。此外数据库还会维护这些锁,当一个资源上的锁数目太多时,自动进行锁升级以提高系统的运行性能,而这一过程对用户来说是完全透明的。那么不同的事务隔离级别能够解决的数据并发能力是不同。解决情况如下表
Y允许,N不允许
隔离级别 | 脏读 | 不可重复读 | 幻象读 | 第一类丢失更新 | 第二类丢失更新 |
---|---|---|---|---|---|
read uncommitted | Y | Y | Y | N | Y |
read committed | N | Y | Y | N | Y |
repeatable read | N | N | Y | N | N |
serializable | N | N | N | N | N |