来源
以下的文章主要是讲述Oracle存储过程中如何正确的使用行锁的实际示例,如果一张入库单表中的相关字段status用来记录相关的入库状态,入库前我们要先判断其入库的标识。如果没有入库的话,我们则做入库的相关处理。
否则则做另一个操作,问题来了,当两个人同时做入库处理时,取得的状态都为'未入库',于是,你可以想到,发生了两次入库操作。在并发问题中,一不小心就可能出现一些不易发现的错误。这里可以通过一个Oracle存储过程中使用行锁来解决这个问题,通过锁,使该存储过程不能同时被两个线程调用来处理同一条记录。
-
create or replace procedure P1(pdm in varchar2) is
-
var_flag char(1);
-
begin
-
select status into var_flag from #T where dm=pdm for update wait 5;
开始事务
执行业务逻辑
修改入库标志
提交事务
若出异常,回滚
- end P1;
注意:记录被锁定之后不可以在该记录上做操作。
SELECT...FOR UPDATE 语句的语法如下:
- SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
OF 子句用于指定即将更新的列,即锁定行上的特定列。
WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
“使用FOR UPDATE WAIT”子句的优点如下:
1防止无限期地等待被锁定的行;
2允许应用程序中对Oracle存储过程中使用行锁的等待时间进行更多的控制。
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窗口中运行sql1q
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存储过程中使用行锁定。
分享到:
相关推荐
Oracle数据库的数据保护机制是指保护数据库中存储的各种数据不被非法使用所造成的数据泄露、更改或破坏。为确保多用户、多应用使用数据库系统的连续性、安全性和高效性,Oracle数据库管理系统提供了多种数据保护机制...
Oracle 11g是Oracle公司推出的数据库管理系统的一个重要版本,其内部技术涵盖了数据库管理、存储结构、查询优化、事务处理、并发控制、安全性等多个方面。这份"Oracle 11g内部技术文档"提供了深入理解Oracle数据库...
【并发控制】在数据库系统中,特别是在DB2和Oracle这样的大型企业级数据库中,是确保多用户环境下数据一致性的重要机制。并发控制通过引入【锁】技术来防止事务间的冲突,保证ACID特性得以实现,即原子性(Atomicity...
值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: BINARY nls_currency: 说明: 为 L 数字格式元素指定用作本地货币符号的字符串。该参数的默认值由 NLS_TERRITORY ...
5. 临键锁(Next-Key Locks):结合了行锁和间隔锁,防止插入重复键值,也是InnoDB存储引擎默认的锁定策略。 二、Oracle锁的模式与级别 1. 锁模式:Oracle支持多种锁模式,如S(共享)、X(独占)、IS(意向共享)...
表是存储数据的基本单元,在Oracle数据库中可以执行多种表操作。 **1. 创建表** **语法:** ```sql CREATE TABLE <table_name> ( <column_name> <data_type> [NOT NULL] [PRIMARY KEY], ... ); ``` **示例:** ``...
- **Block**: Block是Oracle存储的最小单位,存储数据记录,并包含元数据,如块类型、事务信息和磁盘位置等。一个Block可存储一条或多条记录,读取数据时需读取整个Block。 2. **内存结构** - **SGA(System ...
MySQL 无法使用索引的情况包括使用不等于查询、列参与了数学运算或者函数、在字符串 like 时左边是通配符、当 MySQL 分析全表扫描比使用索引快的时候不使用索引、当使用联合索引,前面一个条件为范围查询,后面的...
Oracle提供优化器和行锁管理器来辅助调整SQL,通过避免全表扫描、减少笛卡尔积、使用合适的连接方式(如JOIN操作)以及选择正确的索引策略,可以大大提高查询效率。 内存分配的调整对数据库性能影响巨大。数据库...
MySQL 中的 VARCHAR 等价于 Varchar2,在 Oracle 中使用 Varchar2。 - **Varchar**:可变长度的字符类型,根据实际输入的字符长度占用空间。 5. **合并查询有哪些?** - **UNION**:合并结果集并去除重复记录。 ...
* 选择正确的存储引擎,以 MySQL 为例,包含有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。 * 优化字段的数据类型,记住一个原则,越小的列会越快。 * 为搜索字段添加索引,索引并不肯定就是给主键或是唯—...
总的来说,理解和正确使用MySQL的锁机制对于优化并发性能和避免并发问题至关重要。在设计和编写SQL语句时,应尽可能减少锁定范围,提高系统效率。同时,了解如何排查和处理死锁问题也是数据库管理员必备的技能。
4. **并发控制**:MySQL使用了多种并发控制机制,如锁定(行锁、表锁)、多版本并发控制(MVCC)和乐观锁,以支持高并发环境下的读写操作。 5. **日志系统**:InnoDB存储引擎有redo log(重做日志)和undo log...
- **存储过程**:在数据库内部定义可重用的 SQL 代码块,提高代码的复用率和安全性。 - **触发器**:自动执行响应特定数据库事件(如 INSERT、UPDATE 或 DELETE)的 SQL 命令序列。 5. **MySQL 服务器的安装配置*...
MySQL中的锁结构是数据库管理...理解并正确使用MySQL中的锁结构,可以有效地平衡并发性和数据一致性,避免不必要的锁等待和死锁。在设计数据库操作时,应尽量使用行级锁并优化查询条件,以降低锁冲突和提高系统性能。