键字: 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行锁及其解决方案。 Oracle的锁定机制主要包括共享封锁、独占封锁和共享更新封锁。共享更新封锁是一种行级封锁,它允许用户在获取锁定的数据行上进行读取和更新,但阻止其他...
避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...
FOR UPDATE`语句产生,用于锁定查询到的行,防止其他用户修改。S锁允许共享读取,不允许修改。SX锁允许读取和独占写入,但不允许其他事务的X锁。X锁则是完全独占的,不允许其他任何事务访问。 锁定查询与处理: ...
首先,Oracle提供了一个SQL语句修饰符`FOR UPDATE`,用于在`SELECT`语句中锁定所选的行,以便在后续的事务中对这些行进行更新。这正是我们在标题和描述中提到的行锁实现方法。 1. **开启事务**:在对数据库进行任何...
FOR UPDATE`语句就是一种行级锁的用法,用于在更新数据前锁定选定的行,防止其他事务在此期间对这些行进行修改。当在查询条件中明确指定了主键,并且查询能够匹配到具体行时,InnoDB会实施行锁。例如: ```sql ...
- **TM锁**(表锁):在执行插入、更新、删除操作或`SELECT FOR UPDATE`时触发,目的是确保这些操作可以正常进行,同时阻止其他用户对表执行数据定义语言(DDL)操作。 - **TX锁**(事务锁/行锁):针对正在被修改的...
- 读操作一般不会阻塞写操作,除非使用`SELECT FOR UPDATE`。 #### 七、Oracle锁的具体类型 - **TM锁**:表级锁,用于保护表免受DDL操作的影响。 - **TX锁**:事务锁,用于保护正在修改的数据免受其他会话的干扰。...
ALWAYS表示在更新时总是获取行锁,INTENT仅在SELECT FOR UPDATE时获取行锁,但在更新时获取表锁。默认值为ALWAYS。 4. **shared_servers**: 这个参数定义了启动数据库实例后,用于共享服务器环境的服务器进程数量。...
SELECT * FROM stu_account t WHERE t.count_id=2 FOR UPDATE; ``` 这条语句锁定了 stu_account 表中 count_id 为 2 的行,以便其他会话不能对其进行操作。 ### 外键约束 在 Oracle 中,外键约束需要使用 ALTER ...
SELECT * FROM stu_account t WHERE t.count_id=2 FOR UPDATE; ``` #### 五、约束操作 约束是确保数据完整性和正确性的关键机制。 **1. 添加外键约束** **语法:** ```sql ALTER TABLE <table_name> ADD ...
6. **表锁和行锁**:TM锁在INSERT、UPDATE、DELETE和SELECT FOR UPDATE时触发,防止并发的DDL操作。TX锁则在修改数据时出现,阻止其他会话的修改。了解这些锁的模式(如Row Share、Row Exclusive等)有助于解决阻塞...
ALWAYS表示在更新后立即获取行锁,INTENT则只在执行SELECT FOR UPDATE时获取行锁,但在更新时获取表锁。默认值为ALWAYS,意味着在大多数情况下会进行行级锁定。 4. **shared_servers**: 指定了启动时为共享服务器...
示例代码展示了在没有锁定的情况下,可能存在的并发问题,以及如何通过`FOR UPDATE`子句获取行锁,确保在锁定状态下进行流水号的生成和更新,从而避免并发冲突。 综上所述,Oracle SQL培训讲义主要涵盖了SQL的优化...
删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。 删除环境变量中的PATHT CLASSPATH中包含Oracle的值。 删除“开始”/“程序”中所有...
如果设置为`INTENT`,则只在执行`SELECT FOR UPDATE`时获取行锁,但在实际更新时会获取表锁。 - **值范围**:`ALWAYS` | `DEFAULT` | `INTENT` - **默认值**:`ALWAYS` 4. **shared_servers** - **说明**:指定...
- **示例**: `SELECT * FROM stu_account tw WHERE tw.count_id = 2 FOR UPDATE;` - **解释**: 对`stu_account`表中`count_id`为2的记录施加行级锁,阻止其他事务对该记录进行修改直到当前事务结束。 #### 五、...
SELECT * FROM stu_account tw WHERE tw.count_id=2 FOR UPDATE; ``` - **说明**:此命令用于获取`stu_account`表中`count_id`为2的记录的行锁。当执行此命令时,其他用户或会话将无法修改该行直到当前会话释放锁...
TX锁代表事务锁,当一个事务首次执行数据更改(如INSERT、UPDATE、DELETE操作)或使用`SELECT...FOR UPDATE`语句进行查询时,该事务会获得一个TX锁,并且这个锁将持续到该事务结束(通过执行COMMIT或ROLLBACK操作...
如果设置为 INTENT,只有行锁将用于 SELECT FOR UPDATE,但在更新时将获取表锁。默认值为 ALWAYS。 Shared_servers 参数:该参数指定在启动例程后,要为共享服务器环境创建的服务器进程的数量。默认值为 1。 ...