数据库的并发问题以及数据库的隔离级别

来源:互联网 发布:阿里云账号注册 编辑:程序博客网 时间:2024/05/19 02:39

什么是数据库的并发问题:
      在同一时刻,多个事务进行同一数据记录进行操作,导致的问题。
数据库并发产生的五个问题:

1、脏读:一个事务读到另一事务未提交的更新数据。
           在A事务内,由于B事务对A记录进行了修改但未提交,而A事务马上读取了这个提交的值,在这个值的基础上进了一系列的操作,但另一个事务突然出回滚,导致数据值不一致的问题。

2、虚读:一个事务读到另一事务已提交的新插入的数据。
       在A事务内,由于B事务对A表的插入操作并提交,导致在A事务中前后查询得到关于整张表相关的值不一致的问题
3、不可重复读:一个事务读到另一事务已提交的更新数据。
       在A事务内,由于B事务对A记录的修改并提交,导致在A事务中前后查询得到同一记录的值不一样的问题。

4、第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。
       在A事务内,读取得到某一记录的值,同时在B事务把同一记录的值进行了修改并提交,A事务基于原来读取到的值进行修改后回滚,在数据库中得到丢失了B事务更新的结果。(这种问题在数据库中基本不会出现)。
5、第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。
       在A事务内,读取得到某一记录的值,同时在B事务把同一记录的值进行了修改并提交,A事务基于原来读取到的值进行修改后提交,在数据库中得到丢失了B事务更新的结果。


为了解决以上的一些问题,每个数据库都有隔离级别这样一个概念。
什么是隔离级别:
      在A事务内,我们可以对数据库进行增/删/改/查操作,在B事务内,我们也可以进行数据库的增/删/改/查操作,在A事务开启时锁定什么,而仅充许B事务有什么样的操作。

有以下五种隔离级别:(在数据库的四种隔离级别中都可以解决的一个问题就是第一类丢失更新)
Serializable:可以解决以上5个问题,使以上五个问题都不会出现。

Repeatable Read(可重复读): 在一个事务内进行多次数据查询时,保证多次查询的结果是一致的.

Read Commited(提交读):在一个事务中,发出的SQL语句对数据进行了操作并提交后,其它事务才可以查询到操作后的数据。
在脏读这个问题中,A事务不可以读取到B事务未提交的更改,所以可以解决脏读的问题。对于虚读/不可重复读/第二类丢失更新的问题,由于B事务的操作已提交,所以A事务依然可以查询到B事务所操作的数据,因此虚读/不可重复读/第二类丢失更新的问题不能解决。

Read Uncommited(未提交读):在一个事务中,只要发出了SQL语句对数据进行了操作而未提交,其它事务均可马上查询到操作后的数据,所以这种隔离级别并不能解决其它四个问题。

 

原创粉丝点击