<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
问题描述:
用ADO访问数据库,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录)。在多用户操作下(每个用户采用相同的操作),怎么保证一个用户已选取的记录不被其他用户选取?
处理这类问题的一般方法是增加一个标志列,每个用户取的记录设置一个标志,新的用户只从标志为未取的记录中获取记录。
而本文利用事务与锁来控制数据的处理,不需要增加任何标志列
下面是具体的解决示例
USE tempdb
GO
CREATE TABLE dbo.tb(
id int identity(1, 1),
name nvarchar(128))
INSERT tb(name)
SELECT TOP 100
name
FROM syscolumns
GO
-- 查询窗口发出下面的查询语句
BEGIN TRAN
-- 事务不提交或者回滚, 以保持锁不释放
SET ROWCOUNT 20
SELECT *
FROM tb WITH(UPDLOCK, READPAST)
-- UPDLOCK 让锁保留到事务结束, READPAST 跳过已经锁定的数据
3. 模拟第2个用户(语句与第1个用户一样,只是在另一个连接中执行)
-- 查询窗口发出下面的查询语句
BEGIN TRAN
-- 事务不提交或者回滚, 以保持锁不释放
SET ROWCOUNT 20
SELECT *
FROM tb WITH(UPDLOCK, READPAST)
-- UPDLOCK 让锁保留到事务结束, READPAST 跳过已经锁定的数据
你会看到
查询窗口1列出了前20条数据
查询窗口1列出了21-40条数据
这样就实现了不同的用户取不同数据的需求.
注: 处理完成后, 删除记录, 然后提交事务就可以了.
分享到:
相关推荐
- **共享锁(Shared Locks)**:允许事务读取一行数据,其他事务也可以读取,但不能写入。 - **排他锁(Exclusive Locks)**:只允许事务读取和修改一行数据,其他事务无法读取或修改该行。 - **Next-Key Locks**:结合...
当一个程序持有EXCLUSIVE 锁时,其他所有尝试访问该对象的请求都会被阻塞,直到该锁被释放。 3. **PROMOTABLE 锁**:这是一种特殊的锁,用于更新操作。它可以在已存在SHARED 锁的记录上设置,但在有PROMOTABLE 锁或...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其InnoDB存储引擎为用户提供了一种强大的、可靠的事务处理能力。在深入探讨MySQL的原理之前,我们先要理解数据库的基本概念。数据库是存储和管理数据的系统,它...
与悲观锁相反,乐观锁假设冲突是偶然的,因此在读取数据时不加锁,而是在更新数据时检查数据是否被其他事务修改过。最常见的方式就是在数据库表中添加一个版本(Version)字段,每次更新数据时,都会检查这个版本号...
这种锁在事务中通常用于实现"先读后写"策略,确保数据在更新前不会被其他事务改变。 在实际应用中,选择合适的锁类型取决于事务的隔离级别和并发需求。例如,高并发读取场景可能更倾向于使用NOLOCK或READPAST来提高...
写锁的工作原理是这样的:当一个事务请求写锁时,如果资源当前没有被其他事务持有写锁,那么这个事务可以成功获取写锁并开始修改数据。然而,如果资源已被其他事务持有写锁,那么请求写锁的事务必须等待,直到写锁被...
共享锁(S锁)允许事务读取数据,但不允许其他事务对其加排他锁,防止数据被修改。而排他锁(X锁)允许事务读取和修改数据,但阻止其他事务获取任何类型的锁,直至释放。 数据库事务中的三种异常情况: 1. 脏读:...
2. **脏读**:如果一个用户修改了数据但尚未提交事务,另一个用户在此期间读取了这些未提交的数据,这会导致数据不一致。 3. **不可重复读**:当一个用户读取了一条记录后,另一个用户修改了这条记录,导致第一个...
这种机制能够有效防止数据被其他事务修改,但同时也可能导致较高的性能开销。 ##### 2.2 实现方式 悲观锁主要依赖于数据库层面提供的锁机制来实现。例如,可以通过`SELECT ... FOR UPDATE`语句来锁定符合条件的数据...
常见的实现方式是使用版本号或时间戳机制,当两个事务试图同时更新同一条数据时,只有一个事务能够成功,因为其他事务的版本号或时间戳不再匹配。乐观锁在低冲突环境中表现出色,因为它减少了锁定开销,提高了并发...
锁机制是指在并发控制中,为了避免数据冲突和不一致,使用的机制来控制多个线程或用户对共享资源的访问。锁机制可以分为悲观锁和乐观锁两种。 一、悲观锁 悲观锁是一种对数据的修改抱有悲观态度的并发控制方式。它...
事务处理是一个不可分割的工作单位,多个步骤绑定在一起形成一个逻辑操作,包含内容一个或一组DML语句、DDL语句、DCL语句的任意组合。 事务的基本概念 事务处理是一个逻辑单元,多个步骤绑定在一起形成一个逻辑...
在编程和数据库设计中,"字段实现关联锁定"是一个重要的概念,它涉及到数据一致性、并发控制和事务处理。本主题将深入探讨这个知识点,帮助新手理解如何在实际应用中使用关联锁定来保护数据的完整性。 首先,我们来...
- **下游约束**:在分布式系统中,一个事务的结果可能会影响到其他依赖它的事务,下游约束处理这种依赖关系,确保数据的一致性。 4. **消息服务** 在分布式系统中,消息服务(如RabbitMQ、Kafka、ActiveMQ)常...
乐观锁的基本理念是认为在大多数情况下,数据不会发生冲突,因此它在读取数据时不加锁,只有在更新数据时才会检查在此期间是否有其他事务修改了该数据。通常通过版本号或时间戳机制实现。例如,在数据库中添加一个...
1. 乐观锁(Optimistic Locking)乐观锁假设并发冲突较少,因此在数据读取时不加锁,而在更新时检查数据是否已被其他事务修改。例如,Hibernate通过版本号机制实现乐观锁:在对象中添加一个版本号字段,并在映射文件...
在MVCC中,每个事务都有自己的视图,看到的是事务开始时的数据状态,从而减少了锁的使用和死锁的可能性。 总的来说,SQL Server和Oracle在事务处理上有明显的不同。SQL Server强调了事务的明确控制,提供了多种事务...
在Java服务器页面(JSP)中,防止重复提交是一个重要的考虑因素,因为它可能导致数据不一致性和其他业务逻辑问题。重复提交通常发生在用户由于网络延迟或误操作而多次点击提交按钮时。以下是一些关于如何在JSP中实现...