`

Oracle 的for update行锁

阅读更多
键字: oracle 的for update行锁 
  SELECT...FOR UPDATE 语句的语法如下: 
  SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED]; 
其中: 
  OF 子句用于指定即将更新的列,即锁定行上的特定列。 
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。 
  “使用FOR UPDATE WAIT”子句的优点如下: 
  1防止无限期地等待被锁定的行; 
  2允许应用程序中对锁的等待时间进行更多的控制。 
  3对于交互式应用程序非常有用,因为这些用户不能等待不确定 
  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告 

示例: 
create table t(a varchar2(20),b varchar2(20)); 
insert into t values('1','1'); 
insert into t values('2','2'); 
insert into t values('3','3'); 
insert into t values('4','4'); 
现在执行如下操作: 
在plsql develope中打开两个sql窗口, 
在1窗口中运行sql 
select * from t where a='1' for update; 
在2窗口中运行sql1 
1. select * from t where a='1'; 这一点问题也没有,因为行级锁不会影响纯粹的select语句 
再运行sql2 
2. select * from t where a='1' for update; 则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。 
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3 
3. select * from t where a='1' for update nowait; 则在执行此sql时,直接报资源忙的异常。 
若执行 select * from t where a='1' for update wait 6; 则在等待6秒后,报 资源忙的异常。 
如果我们执行sql4 
4. select * from t where a='1' for update nowait skip Locked; 则执行sql时,即不等待,也不报资源忙异常。 
现在我们看看执行如下操作将会发生什么呢? 
在窗口1中执行: 
select * from t where rownum<=3 nowait skip Locked; 
在窗口2中执行: 
select * from t where rownum<=6 nowait skip Locked; 
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。 
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。

 

分享到:
评论

相关推荐

    ORACLE游标中的多表UPDATE行锁讨论.pdf

    本文主要探讨了Oracle游标中的多表UPDATE行锁及其解决方案。 Oracle的锁定机制主要包括共享封锁、独占封锁和共享更新封锁。共享更新封锁是一种行级封锁,它允许用户在获取锁定的数据行上进行读取和更新,但阻止其他...

    Mysql 数据库死锁过程分析(select for update)

    避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...

    oracle常见的锁查询和处理

    FOR UPDATE`语句产生,用于锁定查询到的行,防止其他用户修改。S锁允许共享读取,不允许修改。SX锁允许读取和独占写入,但不允许其他事务的X锁。X锁则是完全独占的,不允许其他任何事务访问。 锁定查询与处理: ...

    Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁

    首先,Oracle提供了一个SQL语句修饰符`FOR UPDATE`,用于在`SELECT`语句中锁定所选的行,以便在后续的事务中对这些行进行更新。这正是我们在标题和描述中提到的行锁实现方法。 1. **开启事务**:在对数据库进行任何...

    MySQL锁类型以及子查询锁表问题、解锁1

    FOR UPDATE`语句就是一种行级锁的用法,用于在更新数据前锁定选定的行,防止其他事务在此期间对这些行进行修改。当在查询条件中明确指定了主键,并且查询能够匹配到具体行时,InnoDB会实施行锁。例如: ```sql ...

    oracle lock

    - **TM锁**(表锁):在执行插入、更新、删除操作或`SELECT FOR UPDATE`时触发,目的是确保这些操作可以正常进行,同时阻止其他用户对表执行数据定义语言(DDL)操作。 - **TX锁**(事务锁/行锁):针对正在被修改的...

    ORACLE11G性能分析及优化对策

    - 读操作一般不会阻塞写操作,除非使用`SELECT FOR UPDATE`。 #### 七、Oracle锁的具体类型 - **TM锁**:表级锁,用于保护表免受DDL操作的影响。 - **TX锁**:事务锁,用于保护正在修改的数据免受其他会话的干扰。...

    oracle9配置详细说明

    ALWAYS表示在更新时总是获取行锁,INTENT仅在SELECT FOR UPDATE时获取行锁,但在更新时获取表锁。默认值为ALWAYS。 4. **shared_servers**: 这个参数定义了启动数据库实例后,用于共享服务器环境的服务器进程数量。...

    Oracle基本语句

    SELECT * FROM stu_account t WHERE t.count_id=2 FOR UPDATE; ``` 这条语句锁定了 stu_account 表中 count_id 为 2 的行,以便其他会话不能对其进行操作。 ### 外键约束 在 Oracle 中,外键约束需要使用 ALTER ...

    Oracle基本建表语句

    SELECT * FROM stu_account t WHERE t.count_id=2 FOR UPDATE; ``` #### 五、约束操作 约束是确保数据完整性和正确性的关键机制。 **1. 添加外键约束** **语法:** ```sql ALTER TABLE &lt;table_name&gt; ADD ...

    oracle优化

    6. **表锁和行锁**:TM锁在INSERT、UPDATE、DELETE和SELECT FOR UPDATE时触发,防止并发的DDL操作。TX锁则在修改数据时出现,阻止其他会话的修改。了解这些锁的模式(如Row Share、Row Exclusive等)有助于解决阻塞...

    ORACLE9i的INIT参数的详细说明

    ALWAYS表示在更新后立即获取行锁,INTENT则只在执行SELECT FOR UPDATE时获取行锁,但在更新时获取表锁。默认值为ALWAYS,意味着在大多数情况下会进行行级锁定。 4. **shared_servers**: 指定了启动时为共享服务器...

    oracle sql培训讲义

    示例代码展示了在没有锁定的情况下,可能存在的并发问题,以及如何通过`FOR UPDATE`子句获取行锁,确保在锁定状态下进行流水号的生成和更新,从而避免并发冲突。 综上所述,Oracle SQL培训讲义主要涵盖了SQL的优化...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。  删除环境变量中的PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有...

    Oracle初始化参数中文说明

    如果设置为`INTENT`,则只在执行`SELECT FOR UPDATE`时获取行锁,但在实际更新时会获取表锁。 - **值范围**:`ALWAYS` | `DEFAULT` | `INTENT` - **默认值**:`ALWAYS` 4. **shared_servers** - **说明**:指定...

    Oracle开发基础

    - **示例**: `SELECT * FROM stu_account tw WHERE tw.count_id = 2 FOR UPDATE;` - **解释**: 对`stu_account`表中`count_id`为2的记录施加行级锁,阻止其他事务对该记录进行修改直到当前事务结束。 #### 五、...

    Oracle 基本建表语句集

    SELECT * FROM stu_account tw WHERE tw.count_id=2 FOR UPDATE; ``` - **说明**:此命令用于获取`stu_account`表中`count_id`为2的记录的行锁。当执行此命令时,其他用户或会话将无法修改该行直到当前会话释放锁...

    oracle多粒度封锁机制研究(论坛

    TX锁代表事务锁,当一个事务首次执行数据更改(如INSERT、UPDATE、DELETE操作)或使用`SELECT...FOR UPDATE`语句进行查询时,该事务会获得一个TX锁,并且这个锁将持续到该事务结束(通过执行COMMIT或ROLLBACK操作...

    Oracle9i初始化参数中文说明.doc

    如果设置为 INTENT,只有行锁将用于 SELECT FOR UPDATE,但在更新时将获取表锁。默认值为 ALWAYS。 Shared_servers 参数:该参数指定在启动例程后,要为共享服务器环境创建的服务器进程的数量。默认值为 1。 ...

Global site tag (gtag.js) - Google Analytics