精华内容
下载资源
问答
  • 理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf
  • ORACLE锁机制深入理解

    2020-12-16 11:13:59
    数据库是一个多用户使用... 在数据库中有两种基本的类型:排它(Exclusive Locks,即X)和共享(Share Locks,即S)。当数据对象被加上排它时,其他的事务不能对它读取和修改。加了共享的数据对象可以被
  • 为了解决数据库被并发事物访问所带来的问题,数据库提供了锁机制来应对。数据库锁根据锁定的对象不同,可以分为表级锁和行级锁,表级锁锁定的对象是整张表,行级锁锁定的对象是特定的数据行;根据锁之间的关系可以...

    为了解决数据库被并发事物访问所带来的问题,数据库提供了锁机制来应对。数据库锁根据锁定的对象不同,可以分为表级锁和行级锁,表级锁锁定的对象是整张表,行级锁锁定的对象是特定的数据行;根据锁之间的关系可以分为共享锁和独占锁,共享锁允许其他事物获取共享锁,但是不予许其他事物获取独占锁。独占锁既不允许其他事物获取共享锁,又不允许其他事物获取独占锁。 

    行级锁:insert 、update、 delte 和 select…for update等都会隐士的获取一个行级锁。 

    表级锁:lock table tableName in shre mode 或 lock tabletableName in exclusive mode的获取一个表级锁。

    共享锁:共享锁只支持表级锁,没有行级别的。通过lock table tableName in shre mode 添加。

    独占锁:所有的行级锁都是独占锁。Lock table tableName inexlusive mode对整张表获取独占锁。

     

    共享锁的行为:每个事物的共享锁都防止其他事物的独占锁,但是自己的共享锁不妨自己的独占锁。如果事物A独自获取了表T的共享锁,那么事物A还可以获取表T上的独占锁;如果事物A获取了表T的共享锁,事物B也获取了表T的共享锁,那么此时事物A不能获取T的独占锁了,因为事物B的共享锁不允许。

    事物A:locktable tt_stu insharemode;

    事物A进行如下操作会成功:insertinto tt_stu values(4,'a')

    deletefrom tt_stu whereid=3;

    update tt_stu setname='llll0l'whereid=1;

    SELECT * FROM tt_stu whereid=2forupdate;

    这四个操作都需要独占锁,因为只有自己持有共享锁,同一个事物的共享锁允许自己的独占锁。反过来自己的独占锁也不会排斥自己的共享锁,也就是自己不排斥自己。

    如果上述情况,事物A在进行增删改查之前,事物B也执行了locktable tt_stu insharemode;则后四个操作会被阻塞,直到事物B提交了事物释放了共享锁。

    如果上述情况,事物A执行了insert语句,则此时事物B去执行locktable tt_stu insharemode;事物B会被阻塞,因为事物A不仅有表上的共享锁,insert会隐式添加一个独占锁,阻止了事物B的共享锁。

     

    独占锁的行为:每个事物的独占锁,都防止其他事物的共享锁和独占锁,允许自身事物的共享锁和独占锁。

    事物A:locktable tt_stu inexclusivemode;

    事物A进行如下操作都会成功:insertinto tt_stu values(4,'a');

    deletefrom tt_stu whereid=2;

    update tt_stu setname='llll0l'whereid=2 ;

    SELECT * FROM tt_stu whereid=2forupdate;

    locktable tt_stu insharemode;


    因为他们在同一个事物,所以没影响。

    行级独占锁和表级独占锁有区别:事物A执行:locktable tt_stu inexclusivemode;这是表独占锁,事物B无法获取该表的共享锁、及任意行的独占锁(也就是意味事物B无法进行增、删、改以及select…for update)。

    如果事物A执行:SELECT * FROM tt_stu whereid=2forupdate;仅仅对id=2的数据行添加锁,事物B无法对id=2的数据行添加独占锁以及不能添加共享锁(因为共享锁只能是表级锁,包括id=2的行),但是事物B可以对其他数据行添加独占锁(可以对其他数据行进行修改删除以及执行insert)。

    如果事物A执行:insertinto tt_stu values(4,'a');id=4的数据行获取独占锁,事物B无法获取共享锁以及表独占锁(不可以执行locktable tt_stu insharemodelocktable tt_stu inexclusivemode),但是可以执行任意行独占锁(可以执行任意行insertupdatedelteselect for update )。


    PS: 普通的select语句无视锁的存在,锁对其没限制。

    Oracle5种表级锁:之前已经使用过了2种表级锁,表共享锁和表独占锁,以及行共享表级锁、行独占表级锁和表共享行独占表级锁。下图给出了表锁与表锁、dmlddl的关系。

    关系图(此处dml仅指增删改及select  for update)

     

    表共享lock table tableNamein share mode;允许其他Session的表共享和行共享表级锁。阻止其他Session dmlselect for update语句。

    表独占lock table tableNamein exclusive mode;阻止一切锁。阻止其他sessiondml select for update语句。

    行共享表级锁select  for update隐式添加,lock table tableName in row share mode;显式添加。仅允许其他Session获取行共享表级锁、行独占表级锁、表共享和表共享行独占表级锁。允许其他SessionDMLSelect for update.

    行独占表级锁dml操作隐式添加,lock table tableName in row exclusivemode 显式添加。仅允许其他Session获取行共享表级锁和行独占表级锁。允许其他SessionDMLSelect for update

    表共享行独占锁lock table in sharerow exclusive mode;添加。仅允许其他Session获取行共享表级锁。阻止其他Session dmlselect for update语句。

    表共享和表独占2种表级锁与行级锁的互斥关系可以用共享锁独占锁分析,也可遵守上图与Dml语句的关系(因为dml除了select都会加行级锁,select for update也会),但是后面3种表级锁与行级锁的关系,只能遵守上图分析,不能直接根据共享锁和独占锁关系判断。

    举例:

    情况一:

    A locktable tt_stu inrowexclusivemode;行共享表级锁

    B locktable tt_stu insharerowexclusivemode;表共享行独站表级锁,AB不冲突。

    情况二:

    A SELECT * FROM tt_stu whereid=2forupdate;行共享表级锁(同情况一)

    B locktable tt_stu insharerowexclusivemode;表共享行独站表级锁,AB产生冲突,因为表共享行独占锁会阻塞(ddl操作,和ddl互斥)。

    要判断一个表级锁是否会阻塞另外一个表级锁,不仅要看表里的锁兼容性,还要判断是否dml隐式加锁从而判断是否支持dml,要这2个方面都支持才兼容。

     

    PS:分析锁的关系时候,既要考虑表锁上的也要考虑行锁上的兼容性。5种表锁都不允许ddl操作。




    展开全文
  • Oracle数据库锁机制

    2017-11-27 13:23:23
    Lock行为概述 Lock用途 Lock模式 Lock转换和升级 Lock持续时间 Locks和Deadlocks Lock是一种机制,可以防止事务对共享数据的不正确的更新和不...通常,数据库使用两种类型的:排它(exclusive locks)和共享(sha

    Lock是一种机制,可以防止事务对共享数据的不正确的更新和不正确的修改数据结构,在维护数据的一致性和并发性中,它扮演了一个很重要的角色。

    Lock行为概述

    根据获得的锁的操作,数据库维护几种不同类型的锁。通常,数据库使用两种类型的锁:排它锁(exclusive locks)和共享锁(share locks)。在诸如行或表之类的资源上,只能获得一个排它锁,但是可以在单个资源上获得多个共享锁。

    锁会影响读和写的交互。读是查询资源,而写是修改资源。下面总结了Oracle数据库读和写的锁行为:

    • 当语句修改一行时,事务仅获得改行的锁,通过在行级别锁定表数据,数据库最小化对同样数据的争用;
    • 如果一个事务正在修改一行,那么行锁会阻止其他事务同时对改行的修改;
    • 读操作从不阻塞写操作,除了select…for update语句;
    • 写操作从不阻塞读操作,当行正被写操作修改时,数据库使用undo数据来给读操作提供行的一致性视图;

    Lock用途

    在单用户数据库中,不需要锁,因为只有一个用户修改信息,然而,当多个用户访问和修改数据时,数据库必须提供一种方法来防止对相同数据的并发修改。Locks实现了下面的需求:

    • 一致性(Consistency):会话正在查看和修改的数据不会被其他会话更改,直到该会话完成;
    • 完整性(Integrity):数据和结构必须以正确的顺序反映对它们的所有更改;

    Oracle数据库通过锁机制在事务中提供了数据的并发性、一致性和完整性,锁自动执行,不需要用户参与;

    当执行SQL语句时,Oracle数据库自动获得必要的锁,例如,在会话修改数据前,会话必须锁定数据,该锁为会话提供了对数据的独占控制,以便其他事务在锁释放之前不会修改锁定的数据。

    由于Oracle数据库的锁机制和事务控制密切相关,应用程序设计人员只需正确的定义事务,Oracle数据库会自动管理锁,用户不需显式的锁定任何资源,尽管Oracle数据库也能使用户手动锁定数据。

    Lock模式

    Oracle数据库自动使用最低限制适用级别,以提供最高程度的数据并发性,同时也提供了数据完整性。限制级别越低,数据越容易被其他用户访问,反之,限制级别越多,其他事务可获得的锁类型越受限。

    Oracle数据库在多用户数据库中使用两种锁模式:

    • 排他锁模式(Exclusive lock mode):该模式防止相关的资源共享,当事务修改数据时,将会获得排它锁。第一个单独锁定资源的事务是唯一可以改变该资源的事务,直到排它锁被释放;
    • 共享锁模式(Share lock mode):该模式根据涉及的操作,相关的资源可以共享。读取数据的多个用户可以共享数据,持有共享锁可以防止需要排它锁的写操作并发访问,一些事务可以在同一资源上获得共享锁。

    假想一个事务使用select … for update选择了单个表行,该事物获取了exclusive row lock和row share table lock,row lock允许其他会话修改除了已锁定行之外的任何行,而table lock则防止会话修改表的结构,因此,数据库允许尽可能多的语句执行。

    Lock转换和升级

    Oracle数据库在必要时执行锁转换。在锁转换中,数据库自动将较低限制的表锁转换为更高限制的。

    例如:假设一个事务使用select … for update选择了单个行,然后更新锁定的行,在这种情况下,数据库自动将row share table lock转为row exclusive table lock,在该事务,它对已插入、修改和删除的所有行持有exclusive row locks,因为行锁是在最高限制程度下获得的,因此不需要或执行锁转换。

    锁转换不同于锁升级,当多个锁在一个粒度级别(比如行)或数据库将锁提升到更高的粒度级别(比如表)时,就会发生锁升级。如果用户锁定表中许多行,那么一些数据库就会自动将row lock升级到单个表。锁的数量减少了,但是锁定的限制增加了。

    Oracle数据库从不升级锁,锁升级容易引发死锁。

    Lock持续时间

    当事务不再需要资源时,Oracle数据库会自动释放锁。在大多数情况下,数据库持有在事务期间语句获得的锁,这些锁可以防止诸如脏读、丢失更新和来自并发事务的破坏性DDL等破坏性干扰。

    当语句commit或rollback时,Oracle数据库会释放事务中语句获得的所有锁,当回滚到savepoint时,也会释放savepoint后获得的锁。然而,只有不等待之前已锁定资源的事务才能获取当前可用资源上的锁,正在等待的事务继续等待,直到所有之前的事务完全提交或回滚。

    Locks和Deadlocks

    死锁是指两个或多个用户在等待彼此锁定的数据,它阻止事务继续工作。

    Oracle数据库自动探测死锁,并通过回滚包含在死锁中的语句来解决它们,释放一组冲突的行锁。数据库返回一个执行statement-level rollback的事务对应的消息。回滚的语句属于探测死锁的事务。通常,发出信号的事务应该被显式回滚,但它可以在等待后重试回滚语句。

    当事务显式覆盖Oracle数据库的默认锁定时,最常发生死锁。由于Oracle数据库不会升级锁,也不使用read locks来查询,而是使用row-level的锁,死锁很少发生。

    死锁演示:

    会话1
    会话2
    说明
    SQL> update emp set sal=1000
      2 where empno=7369;

    1 row updated.
    SQL> update emp set sal=2000
      2 where empno=7499;

    1 row updated.
    会话1和2都拥有一个行级锁;
    SQL> update emp set sal=2500
      2 where empno=7499;
    SQL> update emp set sal=1500
      2 where empno=7369;
    会话彼此修改对方刚修改过的值,因资源互相被对方占用,故都出现等待;
    SQL> update emp set sal=2500
      2 where empno=7499;

    update emp set sal=2500
           *
    ERROR at line 1:
    ORA-00060: deadlock detected while waiting for resource

    事务1检测到死锁,回滚并返回错误;
    SQL> select empno,ename,sal from emp
      2 where empno in(7369,7499);

         EMPNO ENAME SAL
    ———- ———- ———-
          7369 SMITH 1000
          7499 ALLEN 1600

    只回滚上一个事务;
    SQL> commit;

    Commit complete.

    事务1提交,并结束事务;

    1 row updated.
    事务2显示已更新一行;

    SQL> commit;

    Commit complete.

    SQL> select empno,ename,sal from emp
      2 where empno in(7369,7499);

         EMPNO ENAME SAL
    ———- ———- ———-
          7369 SMITH 1500
          7499 ALLEN 2000
    事务2提交,并结束事务;

    参考:官方文档

    展开全文
  • 1、需求应用场景是这样的:使用Oracle数据保存待办任务,使用状态字段区分任务是否已经被执行。多个Worker线程同时执行任务,执行成功或失败后,修改状态字段的值。假设数据库表结构如下所示。create table Task( ...

    1、需求

    应用场景是这样的:

    使用Oracle数据保存待办任务,使用状态字段区分任务是否已经被执行。多个Worker线程同时执行任务,执行成功或失败后,修改状态字段的值。

    假设数据库表结构如下所示。

    create table Task(
        id      varchar2(32),
        name    varchar2(32),
        flag    varchar2(1),
        worker  varchar2(32)
    );

    flag 可取的值包括:0-待办,1-已办,-1-失败待重试。

    需要避免的问题:
    多个Worker同时工作时,避免出现一个任务被执行多次的情况;避免任务的状态被改错。

    2、分析

    2.1、依赖Java语言的机制

    Java语言的锁机制可以解决并发问题,但只能在单机情况下有效。

    在Tomcat(或其他应用服务器)集群环境下,Java代码中的锁机制是解决不了这个问题的。
    Java语言层面的各种同步、锁机制是在JVM内部的,处理不了跨JVM的情况。

    作为锁的信号量,必须存储在独立于JVM的地方。可以是数据库,可以是Redis。

    2.2、Quartz提供的支持

    在生产环境中,为了避免单点故障,Quartz需要集群提供 HA( High Availability,高可用)支持。Quartz集群依赖将任务信息持久化到数据库中。

    有两个可选的思路:

    1、可以设置单个节点的worker数量为1。首先保证了在单个节点内不会有并发问题。是否能保证集群中同一个Job只有一个实例在跑,需要考察下 Quartz 提供的文档。

    2、在任务类上使用 @DisallowConcurrentExecution 或者 StatefullJob。或许可以达到效果,需要实验。

    采用Quartz管理并发问题,采取的是回避策略,不能充分利用计算资源。

    Quartz的集群环境依赖JDBC存储,一方面需要通过数据库在节点间共享信息,另一方面,基于数据库的行集锁解决了并发问题。

    Quartz 本身已经太庞大,不仔细阅读文档,甚至阅读源代码,也无从猜测其行为,作为企业级的 Timer ,它很好用。解决并发问题,还是找一个更清爽明了的方法吧。

    2.3、通过数据库锁实现

    在考虑解决问题的方案前,先回顾一下数据库的事务隔离级别和Oracle数据库的锁机制。

    2.3.1、事务隔离级别

    事务隔离级别是针对当前会话来说的。

    SQL 92标准定义了4种事务隔离级别。

    1、Read Uncommited : 可以读到其他会话未提交到。
    这是4个级别中最低的。其他会话直接在数据上修改,当前会话会读到其他会话实时的修改状态。
    当 会话B 修改了数据,被当前会话读到,会话B 又回滚了,则当前会话读到了“错误”的数据。 这称为“脏读”。

    2、Read Commited :当前会话可以读到其他会话已经提交到数据。
    这种隔离级别避免了“脏读”。
    如果出现这种状况:

    1) 当前会话读取数据;
    2) 会话B 修改并提交了当前会话数据;
    3) 当前会话再次提交,读到了会话B修改后的数据。
    

    对于当前会话来说,两次读取数据,读到的不一样,这称为“不可重复读”。

    这是Oracle默认的事务隔离级别。

    3、Repeatable Read :当前会话看不到其他会话已经提交的数据修改,但可以看到其他会话新插入的数据。

    不可重复读会出现的问题是:相同的查询条件,在同一个会话中反复执行,查询得到记录条数会不相同。这称为“幻读”。

    4、Serializable :其他会话对数据的修改都不可见。

    需要注意的是,不是其他会话不能修改数据,而是修改对当前会话不可见。

    Oracle支持3种事务隔离级别。

    Oracle支持Read Commited、Repeatable Read ,另外,支持 Read Only。
    Read Only 是最彻底的掩耳盗铃。

    事务隔离级别可以帮我们理解问题,但不是解决问题的方法。

    解决问题,靠数据库的锁机制。

    2.3.2、Oracle数据库的锁机制

    我们需要的是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在 Oracle 中,DML锁包括表级锁和行级锁。

    select … for update 可以获得行级锁。
    update执行也自动获得行级锁。

    这样,我们可以有两个方法达到并发控制的目的:

    方法一:

    通过select … for update 获得行级锁,锁定若干任务,每条数据是一个任务。

    然后执行任务,执行任务完成后,更新状态,提交事务,释放锁。

    Quartz 本身是使用这种机制,解决集群中的并发问题的。

    相关代码文件包括:

    接口定义:
    org.quartz.impl.jdbcjobstore.Semaphore。
    模板方法:
    org.quartz.impl.jdbcjobstore.DBSemaphore。
    实现类:
    org.quartz.impl.jdbcjobstore.StdRowLockSemaphore。
    应用:
    org.quartz.impl.jdbcjobstore.JobStoreSupport。
    

    关键方法包括:obainLock,releseLock和executeInLock。

    方法二:

    按如下步骤执行:

    1、执行如下SQL语句,抢占任务。

    update Task t set t.worker = 'worker-1' 
    where t.worker is null 

    可以对如上SQL进行改进,只抢占指定数量的任务,多余的任务留给其他 worker 做。

    2、逐个执行已经抢占的任务。

    可以通过如下SQL查询出已经抢占成功的任务信息。

    select * from Task t 
    where t.worker = 'worker-1' and t.flag < 1

    3、执行完成后,更改任务状态。

    update Task t set t.flag = 1
    where id = 'some id'

    如果任务执行失败,放回去。

    update Task t set t.flag = -1 , t.worker = null
    where id = 'some id'

    这种方法的要点在第一步。第一步是会出现并发问题的地方。

    Oracle 的update语句会自动获得行级锁。我们可以做如下实验验证:

    1)打开两个PL/SQL 窗口,模拟两个会话,每个窗口都将执行update语句,更新相同的行。比如:第一个窗口执行 update Task set flag=1 where flag=0 and id=‘1’,第二个窗口执行 update Task set flag=2 where flag=0 and id=‘1’。
    2)先执行第一个窗口的update语句,不提交。
    3)再执行第二窗口的 update 语句,发现“在等待”。
    4)提交或回滚第一个窗口的事务后,发现第二窗口停止等待,执行了语句,等待提交。两条语句是串行执行的。
    

    Oracle 本身对 update 的锁机制已经足以支持我们的工作。

    方法三:

    增加 version 或 timestamp 字段,使用乐观锁。

    有了方法二,这种方法偏麻烦。

    展开全文
  • 浅谈ORACLE数据库锁的类型与机制.pdf
  • 本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决,并对死锁这一比较严重的...
  • 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态。 Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性。同时,并行事务的修改必须与其他并行...
  • 介绍了Oracle数据库锁的种类及研究数据库教程 电脑资料 本文通过对Oracle数据库锁机制的研究首先介绍了Oracle数据库锁的种类并描述了实际应用中遇到的与锁相关的异常情况特别对经常遇到的由于等待锁而使事务被挂起的...
  • Oracle 数据库锁机制

    2008-03-31 15:43:00
    Oracle 数据库锁机制 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的...
      
    
                                                   Oracle 数据库锁机制
     
    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
    在数据库中有两种基本的锁类型:排它锁( Exclusive Locks ,即 X 锁)和共享锁( Share Locks ,即 S 锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
    在实际应用中经常会遇到的与锁相关的异常情况,如由于等待锁事务被挂起、死锁等现象,如果不能及时地解决,将严重影响应用的正常执行,而目前对于该类问题的解决缺乏系统化研究和指导,本文在总结实际经验的基础上,提出了相应的解决方法和具体的分析过程。
    Oracle 数据库的锁类型
    根据保护的对象不同, Oracle 数据库锁可以分为以下几大类: DML 锁( data locks ,数据锁),用于保护数据的完整性; DDL 锁( dictionary locks ,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩( internal locks and latches ),保护数据库的内部结构。
    DML 锁的目的在于保证并发情况下的数据完整性,本文主要讨论 DML 锁。在 Oracle 数据库中, DML 锁主要包括 TM 锁和 TX 锁,其中 TM 锁称为表级锁, TX 锁称为事务锁或行级锁。
    Oracle 执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM 锁获得后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查 TX 锁相容性时就不用再逐行检查锁标志,而只需检查 TM 锁模式的相容性即可,大大提高了系统的效率。 TM 锁包括了 SS SX S X 等多种模式,在数据库中用 0 6 来表示。不同的 SQL 操作产生不同类型的 TM 锁。如表 1 所示。
    在数据行上只有 X 锁(排他锁)。在 Oracle 数据库中,当一个事务首次发起一个 DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后, TX 锁被释放,其他会话才可以加锁。
    Oracle 数据库发生 TX 锁等待时,如果不及时处理常常会引起 Oracle 数据库挂起,或导致死锁的发生,产生 ORA-60 的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
    TX 锁等待的分析
    在介绍了有关地 Oracle 数据库锁的种类后,下面讨论如何有效地监控和解决锁等待现象,及在产生死锁时如何定位死锁的原因。
    监控锁的相关视图 数据字典是 Oracle 数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。和锁相关的数据字典视图如表 2 所示。
    TX 锁等待的监控和解决在日常工作中,如果发现在执行某条 SQL 时数据库长时间没有响应,很可能是产生了 TX 锁等待的现象。为解决这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中断事务。
    死锁的监控和解决在数据库中,当两个或多个会话请求同一个资源时会产生死锁的现象。死锁的常见类型是行级锁死锁和页级锁死锁, Oracle 数据库中一般使用行级锁。下面主要讨论行级锁的死锁现象。
    Oracle 检测到死锁产生时,中断并回滚死锁相关语句的执行,报 ORA-00060 的错误并记录在数据库的日志文件 alertSID.log 中。同时在 user_dump_dest 下产生了一个跟踪文件,详细描述死锁的相关信息。
    在日常工作中,如果发现在日志文件中记录了 ora-00060 的错误信息,则表明产生了死锁。这时需要找到对应的跟踪文件,根据跟踪文件的信息定位产生的原因。
    如果查询结果表明,死锁是由于 bitmap 索引引起的,将 IND_T_PRODUCT_HIS_STATE 索引改为 normal 索引后,即可解决死锁的问题。
    1 Oracle TM 锁类型
    锁模式
    锁描述
    解释
    SQL 操作
    0
    none
     
     
    1
    NULL
    Select
    2
    SS(Row-S)
    行级共享锁,其他对象只能查询这些数据行
    Select for update Lock for update Lock row share
    3
    SX(Row-X)
    行级排它锁,在提交前不允许做 DML 操作
    Insert Update Delete Lock row share
    4
    S(Share)
    共享锁
    Create index Lock share
    5
    SSX(S/Row-X)
    共享行级排它锁
    Lock share row exclusive
    6
    X(Exclusive)
    排它锁
    Alter table Drop able Drop index Truncate table Lock exclusive
     
    2 数据字典视图说明
    视图名
    描述
    主要字段说明
    v$session
    查询会话的信息和锁的信息。
    sid,serial# :表示会话信息。
    program :表示会话的应用程序信息。
    row_wait_obj# :表示等待的对象。
    dba_objects 中的 object_id 相对应。
    v$session_wait
    查询等待的会话信息。
    sid :表示持有锁的会话信息。
    Seconds_in_wait :表示等待持续的时间信息
    Event :表示会话等待的事件。
    v$lock
    列出系统中的所有的锁。
    Sid :表示持有锁的会话信息。
    Type :表示锁的类型。值包括 TM TX 等。
    ID1 :表示锁的对象标识。
    lmode,request :表示会话等待的锁模式的信
    息。用数字 0 6 表示,和表 1 相对应。
    dba_locks
    v$lock 的格式化视图。
    Session_id :和 v$lock 中的 Sid 对应。
    Lock_type :和 v$lock 中的 type 对应。
    Lock_ID1 v$lock 中的 ID1 对应。
    Mode_held,mode_requested :和 v$lock
    lmode,request 相对应。
    v$locked_object
    只包含 DML 的锁信息,包括回滚段和会话信息。
    Xidusn,xidslot,xidsqn :表示回滚段信息。和
    v$transaction 相关联。
    Object_id :表示被锁对象标识。
    Session_id :表示持有锁的会话信息。
    Locked_mode :表示会话等待的锁模式的信
    息,和 v$lock 中的 lmode 一致。
     
     
     
     
    展开全文
  • 数据库中有两种基本的类型:排它(Exclusive Locks,即X)和共享(Share Locks,即S)。当数据对象被加上排它时,其他的事务不能对它读取和修改;加了共享的数据对象可以被其他
  • oracle数据库锁使用

    2011-08-07 07:28:56
    Oracle锁机制归纳总结,该文档详细介绍了各种档的使用方法和优缺点
  • 数据库锁机制 很详细的教程,易懂

    万次阅读 多人点赞 2017-05-18 22:38:30
    数据库大并发操作要考虑死锁和的性能问题。看到网上大多语焉不详(尤其更新),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另...
  • Oracle锁机制深度分析

    千次阅读 2019-01-10 20:11:44
    Oracle锁机制深度分析一、概述二、Oracle两种锁机制三、Oracle锁类型1、 DML锁1)、TM锁2)、TX锁2、 DDL锁1)、排它的DDL锁定(Exclusive DDL Lock)2)、共享的DDL锁定(Shared DDL Lock )3)、可打破的解析锁定...
  • 锁机制数据库一个比较重要的机制,在处理事务的并发性方面起着至关重要的作用,我也看过好多关于锁机制的文章blog,什么悲观锁、乐观锁?什么共享锁、排他锁?还有什么行级锁、表级锁?另外还有读锁、写锁?oh,my...
  • 数据库锁机制

    万次阅读 多人点赞 2016-08-15 12:38:50
    数据库大并发操作要考虑死锁和的性能问题。看到网上大多语焉不详(尤其更新),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一...
  • Oracle数据库悲观与乐观详解

    万次阅读 2015-12-14 11:21:07
    Oracle数据库悲观与乐观详解 Oracle数据库悲观与乐观是本文我们主要要介绍的内容。有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数...
  • Oracle/MYSQL数据库中的锁机制研究

    千次阅读 2012-06-24 21:15:25
    本文通过对Oracle数据库锁机制的研究,对死锁这一比较严重的现象,提出了相应的解决方法和具体的分析过程。 本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁...
  • oracle 12c 数据库 教程

    2018-11-06 10:57:05
    (三)使用 DBCA 创建 Oracle 数据库 21 (四)验证 Oracle Database 12cR2 环境 25 (五)使用 oracle-database-server-12cR2-preinstall 包 25 三、管理数据库实例 27 (一)管理工具 27 (二)初始化参数 27 (三...
  • Oracle数据库锁的种类及研究

    千次阅读 2012-03-20 09:19:15
    数据库中有两种基本的类型:排它(Exclusive Locks,即X)和共享(Share Locks,即S)。当数据对象被加上排它时,其他的事务不能对它读取和修改;加了共享的数据对象可以被其他事务
  • Oracle数据库中存储结构、运行机制、日期相关的函数、序列、表的操作、事务等接单介绍
  • Oracle-锁机制(1)

    千次阅读 2018-06-03 11:26:10
    � 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在升 级。 � 当某行被修改时,它将阻塞别人对它的修改。 � 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,302
精华内容 18,920
关键字:

oracle数据库锁机制