数据库并发控制机制

问题背景及特点:

我们在使用多用户数据库时常常会碰到数据更新失败、删除失等情况,如果有多个用户且同时访问一个数据库则当他们的事务同时使用相同的数据时可能会发生并发问题。

并发问题包括:

1.丢失或覆盖更新。(幻像读)

2.未确认的相关性(脏读)。

3.不一致的分析(非重复读)。

详细描述:

1.丢失更新

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

例如,两个编辑人员制作了同一文档的电子复本。每个编辑人员独立地更改其复本,然后保存更改后的复本,这样就覆盖了原始文档。最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则可以避免该问题。

2.未确认的相关性(脏读)

当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

例如,一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该复本包含到目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前任何人都不能读取更改的文档,则可以避免该问题。

3.不一致的分析(非重复读)

当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。

例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

4.幻像读

当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

从上面可以看到,解决并发主要是用到了锁和事务。

锁 :给记录或表加上锁是为了对当前操作对象加上一个状态表示位,让其它用户在获取编辑权限时有了判断。

事务:是为了保证一组操作的完整性。(要么就全部成功,要么就全部失败)

一般处理并发问题时我这样做:

1.开启事务。

2.申请写权限,也就是给对象(表或记录)加锁。

3.如果失败,则结束事务,过一会重试。

4.如果成功,也就是给对象加锁成功,防止其它用户再用同样的方式打开。

5.进行编辑操作。

6.写入所进行的编辑结果。

7.如果写入成功,则提交事务,完成操作。

8.如果写入失败,则回滚事务,取消提交。

9.(7.8)两步操作已释放了锁定的对象,恢复到操作前的状态。

时间: 2024-08-04 03:17:29

数据库并发控制机制的相关文章

浅尝数据库并发控制

        数据库是一个共享资源,可以供多个用户使用.然而,对于大多数程序员来说,单处理机系统是我们接触最多的系统,运行在其上的数据库事务也并非真正意义上的并行,实际上它是这些并行事务的并行操作轮流交叉运行,这种并行执行方式称为交叉并发方式(Interleaved Concurrency),这样可以减少处理机的空闲时间,提高系统的效率.而在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现真正意义上的并行运行,而这种并行执行方式,我们称之为同时并行方式(Simu

Java并发控制机制详解

在一般性开发中,笔者经常看到很多同学在对待java并发开发模型中只会使用一些基础的方法.比如Volatile,synchronized.像Lock和atomic这类高级并发包很多人并不经常使用.我想大部分原因都是来之于对原理的不熟悉导致的.在繁忙的开发工作中,又有谁会很准确的把握和使用正确的并发模型呢? 所以最近基于这个思想,作者打算把并发控制机制这部分整理成一篇文章.既是对自己掌握知识的一个回忆,也是希望这篇讲到的内容能帮助到大部分开发者. 并行程序开发不可避免地要涉及多线程.多任务的协作和数

Informix 11.7非操作系统用户访问数据库的机制使用

这种方法使系统可以通过映射系统中已存在的除 Informix 和 root 外的其他用户,来http://www.aliyun.com/zixun/aggregation/11872.html">访问数据库.这种机制将会减少为了使用数据库而创建的大量系统用户.减少 DBA 的工作量,增加系统的安全系数. 1. 概述 Informix11.7 提供了非操作系统用户访问数据库的机制.在 Informix 之前的版本,所有访问数据库的用户必须是一个拥有相应权限的系统用户.从 11.7 开始,In

Java并发控制机制详解_java

在一般性开发中,笔者经常看到很多同学在对待java并发开发模型中只会使用一些基础的方法.比如Volatile,synchronized.像Lock和atomic这类高级并发包很多人并不经常使用.我想大部分原因都是来之于对原理的不属性导致的.在繁忙的开发工作中,又有谁会很准确的把握和使用正确的并发模型呢? 所以最近基于这个思想,本人打算把并发控制机制这部分整理成一篇文章.既是对自己掌握知识的一个回忆,也是希望这篇讲到的类容能帮助到大部分开发者.  并行程序开发不可避免地要涉及多线程.多任务的协作和

Java并发控制机制学习笔记

在一般性开发中,笔者经常看到很多同学在对待java并发开发模型中只会使用一些基础的方法.比如volatile,synchronized.像Lock和atomic这类高级并发包很多人并不经常使用.我想大部分原因都是来之于对原理的不属性导致的.在繁忙的开发工作中,又有谁会很准确的把握和使用正确的并发模型呢? 所以最近基于这个思想,本人打算把并发控制机制这部分整理成一篇文章.既是对自己掌握知识的一个回忆,也是希望这篇讲到的类容能帮助到大部分开发者. 并行程序开发不可避免地要涉及多线程.多任务的协作和数

Mysql数据库锁定机制详细介绍_Mysql

前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种使用最为频繁的存储引擎MyISAM和Innodb各自的锁定机制进行较为详细的分析. MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.MyS

.net中数据库事务机制

数据|数据库 在初始化SqlTransaction类时,你需要使用SqlConnection类的BeginTranscation()方法: SqlTransaction myTran; myTran=myConn.BeginTransaction();  该方法返回一个SqlTransaction类型的变量.在调用BeginTransaction()方法以后,所有基于该数据连接对象的SQL语句执行动作都将被认为是事务MyTran的一部分.同时,你也可以在该方法的参数中指定事务隔离级别和事务名

轻松掌握MySQL数据库锁机制的相关原理

在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的.这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理. 在一个update和insert操作频繁的表中,少量数据测试的时候运行良好,在实际运营中,因数据量比较大(21万条记录),会出现死锁现象,用show processlist查看,可以看到一个update语句状态是Locked,一个delete语句状态是Sending data.查看了一下参考手册,把锁定相关的资料整理下来,以便自己记录和追踪该问题的解决

MySQL数据库锁机制的相关原理

在一个update和insert操作频繁的表中,少量数据测试的时候运行良好,在实际运营中,因数据量比 较大(21万条记录),会出现死锁现象,用show processlist查看,可以看到一个update语句状态是 Locked,一个delete语句状态是Sending data.查看了一下参考手册,把锁定相关的资料整理下来,以便 自己记录和追踪该问题的解决情况: MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB 表进行行级锁定 .在许多情