`
何时雨再来
  • 浏览: 2387 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关数据库锁的一系列问题

阅读更多
怎样用SQL语句对数据库表进行加锁和解锁? .
分类: 数据库 2010-03-20 09:29 1220人阅读 评论(0) 收藏 举报


      锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象。即如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。这些问题包括:丢失更新、脏读、不可重复读和幻觉读:


1.当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。例如,两个编辑人员制作了同一文档的电子复本。每个编辑人员独立地更改其复本,然后保存更改后的复本,这样就覆盖了原始文档。最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则可以避免该问题。


2. 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。例如,一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该复本包含到目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前任何人都不能读取更改的文档,则可以避免该问题。


3.不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。


4.幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。


      所以,处理多用户并发访问的方法是加锁。锁是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。为了控制锁定的资源,应该首先了解系统的空间管理。在SQL Server 2000系统中,最小的空间管理单位是页,一个页有8K。所有的数据、日志、索引都存放在页上。另外,使用页有一个限制,这就是表中的一行数据必须在同一个页上,不能跨页。页上面的空间管理单位是盘区,一个盘区是8个连续的页。表和索引的最小占用单位是盘区。数据库是由一个或者多个表或者索引组成,即是由多个





SQL语句:

LOCK TABLES tablename WRITE;
LOCK TABLES tablename READ;
INSERT INTO assignment VALUES (1,7513,'0000-00-00',5),(1,7513,'2003-01-20',8.5);
UNLOCK TABLES;

对于多个用户同时提交表单,并且同时向数据库中得到表单ID,我是这样解决的:

mysql_query("lock tables po read");
mysql_query("lock tables po write");

mysql_query("update po set id=id +1"));// increase po id

$sql = "SELECT id FROM po";
$result = mysql_query($sql);
if ($row = mysql_fetch_assoc($result)) {
    echo $row["id"]; // this order will use this id
}

mysql_free_result($result);
mysql_query("unlock tables");

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

帮忙看看如何在这段代码前后给数据库写加锁和解锁语句

'(在这里给数据库加锁,如何写加锁语句?)
       ...............
       i = str(从记录集rst0中得到最大入库单号)
       '若不加锁,在这容易造成并发冲突。因为在申请到最大入库单号之后还没有来得及建立实际记录,其它客户端可能也申请到了同样的入库单号
       ..............
       rst.open "select * from 入库 where 入库单号= " + i + " and 商品ID=0 ", cn, adOpenStatic, adLockOptimistic
       If rst.RecordCount = 0 Then 下一个入库单号 = i + 1
       ...............
       '(在这里给数据库解锁,如何写解锁语句?)

解答1:先将需要加锁执行的语句声明成一个事务(如2楼),然后加锁,SQL Server中锁的类型很多,看你需要加哪种类型的锁:
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK    不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。
PAGLOCK    在通常使用单个表锁的地方采用页锁。
READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。 READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED 等同于 NOLOCK。
REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。   
ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。
SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX    使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。
UPDLOCK    读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。

解答2”要使一表在整个处理过程中不会被并发修改
可用事务
begin tran
select * from 表名 with HOLDLOCK 
--处理语句
........
............


commit tran


加了 with holdlock后,在事务提交之前,别人动不了你的表
。。。。。。。。。。。。。。。。。。。。。。。。。。。。

分享到:
评论

相关推荐

    数据库中事物与锁的课件

    事务是数据库系统执行一系列操作的逻辑单元,这些操作要么全部成功,要么全部失败,不允许部分完成。这一特性确保了数据库在处理错误时能够恢复到事务开始前的状态,从而保持数据的正确性。 9.1.1 事务的概念 事务...

    数据库事务、hibernate悲观锁和乐观锁

    事务是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部不执行,遵循ACID(原子性、一致性、隔离性和持久性)原则。 原子性(Atomicity)确保了事务中的每个操作被视为单个不可分割的操作,...

    通过shell脚本自动检测DB2数据库锁等待

    Shell脚本是一种用来控制操作系统的命令解释器,它可以自动化执行一系列复杂的命令。在数据库管理中,使用shell脚本自动化常规任务,如检测数据库的锁等待状态,可以大幅提高数据库管理员的工作效率。通过脚本可以...

    Oracle数据库常见维护问题手册-精典

    这将显示一系列关于数据库实例启动的信息,包括各种内存结构的初始化、数据文件的加载以及最终数据库状态的变化等。 **数据库关闭方式** 同样地,使用`SQL*Plus`工具来关闭数据库实例: ```bash sqlplus / as ...

    Oracle数据库常见问题诊断方法

    这部分主要聚焦于Oracle数据库在操作过程中可能遇到的一系列典型错误代码,包括但不限于ORA-12571、ORA-03113、ORA-03114、ORA-01041等。这些错误通常与网络连接中断、进程异常终止、数据库实例关闭或未启动等问题...

    数据库里锁的基本概念

    在多用户环境中,数据库面临着高并发的操作场景,这往往会导致一系列数据不一致性问题。为了确保数据的一致性与完整性,引入锁机制变得至关重要。 ##### 失去更新(Lost Update) - **场景描述**:假设有两个用户A...

    ACCESS数据库锁定问题.pdf

    这可能涉及使用事务(Transaction)来确保一系列数据库操作的原子性,以及自定义逻辑来锁定和解锁特定记录。 7. **窗体的锁定方式**: Access的窗体也有锁定功能,可以用来限制用户对特定字段的编辑。这虽然不等同...

    内存数据库及其技术浅论

    内存由于比传统硬盘具有更高的读写速度,因此在数据库处理的过程中,若将数据库直接置于内存之中,必然可以加快工作效率,节省大量的...希望通过文中的研究能够为解决内存数据库存在的一系列技术难题提供一定的参考和借鉴。

    关于Oracle数据库中的锁机制深入研究

    为了管理和解决这些问题,数据库管理员可以使用一系列数据字典视图来监控锁的状态。例如,通过查询V$LOCK、V$SESSION、V$SESSION_WAIT等视图,可以获取当前事务的锁信息、等待状态以及持有锁的事务信息。当发现TX锁...

    MySQL数据库工程师常见面试题

    事务是一系列操作的集合,这些操作要么全部成功,要么全部失败。在事务执行期间,为了保证数据的一致性和隔离性,通常会使用锁来保护数据资源不受并发操作的影响。例如,在更新操作中,为了避免两个事务同时修改同一...

    数据库相关文档

    它基于关系理论,由一系列二维表格构成,每个表格称为一个表,表之间可以通过公共字段建立联系。表中的每一行代表一个实体,每一列代表实体的一个属性。 接着,我们会接触到SQL(Structured Query Language),这是...

    事务和锁(数据库开发必备)

    事务是数据库操作的基本单位,它包含了对数据库的一系列操作,这些操作要么全部成功,要么全部失败。这四个特性,即ACID(原子性、一致性、隔离性和持久性),是事务的核心属性: 1. **原子性(Atomicity)**:事务...

    数据库实现原理 数据库

    - **事务处理**:事务是一系列的操作序列,这些操作要么全部完成,要么一个都不做。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个特性。 #### 2.2 IBM Informix 的...

    数据库的密码处理问题研究

    本文将针对这些问题进行深入探讨,并提供一系列实用的解决方案。 #### Oracle数据库密码处理常见问题及解决方案 ##### 一、Oracle数据库用户密码被锁定 **问题描述**: 在使用Oracle数据库时,如果用户连续输入...

    HNU数据库原理数据库设计与应用开发大作业

    在“HNU数据库原理数据库设计与应用开发大作业”中,我们可以探讨一系列关于数据库理论、设计与实际应用的重要知识点。数据库是信息系统的核心组成部分,用于存储、管理并检索数据,尤其在信息化社会中扮演着至关...

    数据库题库

    5. **事务处理**:数据库事务是一系列数据库操作的逻辑单元,必须满足ACID属性(原子性、一致性、隔离性和持久性),以确保数据的完整性和一致性。 6. **并发控制**:在多用户环境中,如何协调并发操作避免数据冲突...

    数据库十二个例子

    在"数据库十二个例子"中,我们可以探索一系列与数据库相关的实际应用和概念。以下是这十二个例子可能涵盖的一些关键知识点: 1. **数据库类型**:数据库可以分为多种类型,如关系型数据库(如MySQL、Oracle、SQL ...

    数据库相关知识了解(一)

    事务是指数据库管理系统对数据进行的一系列操作,包括读写操作、插入操作、删除操作等。锁是指数据库管理系统对数据进行的锁定操作,用于防止多个用户同时操作数据。 事务的隔离级别有: * 读未提交:读取未提交的...

Global site tag (gtag.js) - Google Analytics