论文部分内容阅读
摘要并发控制是数据库事务处理的重要环节,最新数据库系统大多是基于WEB而开发的应用系统,原有保守式并发控制演变成基于WEB的开放式并发控制,本文首先介绍了WEB开放式并发控制的锁机制,接着针对ADO.net探讨了开放式并发控制的解决方法,并给出了具体的运用。
关键词并发控制 封锁协议 开放式 时间戳 所有值
文章编号1008-5807(2011)02-114-01
一、并发控制
1、并发控制负责正确协调并发事物的执行,保证并发的存取操作不致破坏数据库的完整性和一致性。一个数据库管理系统,其大量的基础数据资源不可能是单一用户进行访问和管理,所以数据库必然是处在一个多用户共享的工作环境中,保障多用户对数据库的共享访问是极其重要的,对于那些有关联的数据,多用户访问同一个或具有这样关系的数据就可能会产生相互干扰的问题,访问同一个数据,如果都是读取,没有干扰,如果有的用户是读取操作,有的是修改、删除操作,显然会产生干扰,多用户访问关联数据类似于访问同一个数据情况,有的用户访问就可能被近等待或者取消,按照什么样的规则等待或取消,保持数据的完整性和一致性,就需要一个控制机制来解决,这就是并发控制技术的存在的意义。
2、Web应用中并发控制的实现有两种锁机制:即通常所说的“乐观锁(Optimistic Locking)” 和“悲观锁(Pessimistic Locking)”。
(1)乐观锁(Optimistic Locking)
乐观锁(optimistic locking)则乐观的认为资料的存取很少发生同时存取的问题,因而不作数据库层次上的锁定,为了维护正确的数据,乐观锁定使用应用程序上的逻辑实现版本控制来解决。并发控制时,数据不一致的情况一旦发生,有几个解决的方法 ,一种是先更新为主,一种是后更新的为主,比较复杂的就是检查发生变动的数据来实现,或是检查所有属性来实现乐观锁定。
(2)悲观锁(Pessimistic Locking)
虽然乐观锁能够提高系统的性能,但它是对发生冲突的访问进行事后的补救,应用在用户输入数据量很少的场合比较适合,但如果在 企业 ERP,用户与系统交互涉及大量数据在页面表单上录入,如果事后提交失败后才提示用户要重新录入是很不现实的,所以有必要进行事前控制,这就要采用悲观锁。
二、开放式并发技术的运用
一般系统可采用ADO.NET的并发控制,ADO.NET中数据结构基于断开的数据,使用开放式并发技术。在开放式并发中,只有在访问数据库时才设置并保持锁。这些锁将防止其他用户在同一时间更新记录。除了进行更新这一确切的时刻之外,数据始终可用。当试图更新时,已更改行的初始版本将与数据库中的现有行进行比较。如果两者不同,更新将失败,并引发并发错误。这时,将由所创建的业务逻辑来协调这两行。
开放式并发有两种常规的方式来确定是否已发生更改:版本方法(实际版本号或日期时间戳)和保存所有值方法。
1、版本号方法
在版本号方法中,要更新的记录必须增加一个包含日期时间戳或版本号的列。当读取该记录时,日期时间戳或版本号将保存在客户端。然后,将对该值进行部分更新。
处理并发的一种方法是仅当WHERE子句中的值与记录上的值匹配时才进行更新。该方法的SQL表示形式为:
UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE DateTimeStamp = @origDateTimeStamp
或者,可以使用版本号进行比较:
UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE RowVersion = @origRowVersionValue
如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新。如果不匹配,则将返回错误。为了确保日期时间戳或版本号的准确性,要在表上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新:
CREATE TRIGGER RowVersion ON [dbo].[Table1] FOR INSERT, UPDATE, DELETE
AS
UPDATE Table1 SET Table1. DateTimeStamp =getdate() where Table1.Id=( select Id from inserted)
2、保存所有值方法
使用日期时间戳或版本号的替代方法是在读取记录时获取所有字段的副本。ADO.NET 中的 DataSet 对象维护每个修改记录的两个版本:初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。如果它们匹配,则表明数据库记录在被读取后尚未经过更改。在这种情况下,数据集中已更改的值将成功地写入数据库。
对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。由于不存在初始记录,添加新记录(INSERT 命令)只需要当前值;删除记录(DELETE 命令)只需要使用初始值来定位要删除的记录。
参考文献:
[1]庞振平.数据库原理及应用基础.华南理工大学出版社,2007.8.
关键词并发控制 封锁协议 开放式 时间戳 所有值
文章编号1008-5807(2011)02-114-01
一、并发控制
1、并发控制负责正确协调并发事物的执行,保证并发的存取操作不致破坏数据库的完整性和一致性。一个数据库管理系统,其大量的基础数据资源不可能是单一用户进行访问和管理,所以数据库必然是处在一个多用户共享的工作环境中,保障多用户对数据库的共享访问是极其重要的,对于那些有关联的数据,多用户访问同一个或具有这样关系的数据就可能会产生相互干扰的问题,访问同一个数据,如果都是读取,没有干扰,如果有的用户是读取操作,有的是修改、删除操作,显然会产生干扰,多用户访问关联数据类似于访问同一个数据情况,有的用户访问就可能被近等待或者取消,按照什么样的规则等待或取消,保持数据的完整性和一致性,就需要一个控制机制来解决,这就是并发控制技术的存在的意义。
2、Web应用中并发控制的实现有两种锁机制:即通常所说的“乐观锁(Optimistic Locking)” 和“悲观锁(Pessimistic Locking)”。
(1)乐观锁(Optimistic Locking)
乐观锁(optimistic locking)则乐观的认为资料的存取很少发生同时存取的问题,因而不作数据库层次上的锁定,为了维护正确的数据,乐观锁定使用应用程序上的逻辑实现版本控制来解决。并发控制时,数据不一致的情况一旦发生,有几个解决的方法 ,一种是先更新为主,一种是后更新的为主,比较复杂的就是检查发生变动的数据来实现,或是检查所有属性来实现乐观锁定。
(2)悲观锁(Pessimistic Locking)
虽然乐观锁能够提高系统的性能,但它是对发生冲突的访问进行事后的补救,应用在用户输入数据量很少的场合比较适合,但如果在 企业 ERP,用户与系统交互涉及大量数据在页面表单上录入,如果事后提交失败后才提示用户要重新录入是很不现实的,所以有必要进行事前控制,这就要采用悲观锁。
二、开放式并发技术的运用
一般系统可采用ADO.NET的并发控制,ADO.NET中数据结构基于断开的数据,使用开放式并发技术。在开放式并发中,只有在访问数据库时才设置并保持锁。这些锁将防止其他用户在同一时间更新记录。除了进行更新这一确切的时刻之外,数据始终可用。当试图更新时,已更改行的初始版本将与数据库中的现有行进行比较。如果两者不同,更新将失败,并引发并发错误。这时,将由所创建的业务逻辑来协调这两行。
开放式并发有两种常规的方式来确定是否已发生更改:版本方法(实际版本号或日期时间戳)和保存所有值方法。
1、版本号方法
在版本号方法中,要更新的记录必须增加一个包含日期时间戳或版本号的列。当读取该记录时,日期时间戳或版本号将保存在客户端。然后,将对该值进行部分更新。
处理并发的一种方法是仅当WHERE子句中的值与记录上的值匹配时才进行更新。该方法的SQL表示形式为:
UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE DateTimeStamp = @origDateTimeStamp
或者,可以使用版本号进行比较:
UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE RowVersion = @origRowVersionValue
如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新。如果不匹配,则将返回错误。为了确保日期时间戳或版本号的准确性,要在表上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新:
CREATE TRIGGER RowVersion ON [dbo].[Table1] FOR INSERT, UPDATE, DELETE
AS
UPDATE Table1 SET Table1. DateTimeStamp =getdate() where Table1.Id=( select Id from inserted)
2、保存所有值方法
使用日期时间戳或版本号的替代方法是在读取记录时获取所有字段的副本。ADO.NET 中的 DataSet 对象维护每个修改记录的两个版本:初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。如果它们匹配,则表明数据库记录在被读取后尚未经过更改。在这种情况下,数据集中已更改的值将成功地写入数据库。
对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。由于不存在初始记录,添加新记录(INSERT 命令)只需要当前值;删除记录(DELETE 命令)只需要使用初始值来定位要删除的记录。
参考文献:
[1]庞振平.数据库原理及应用基础.华南理工大学出版社,2007.8.