oracle 变量 out,Oracle 变量之 DDL_LOCK_TIMEOUT

本文介绍了Oracle 11g中DDL_LOCK_TIMEOUT参数的作用及使用方法。该参数定义了DDL语句在DML锁队列中等待的时间限制,默认为0,即不等待。通过调整此参数值,可以设置DDL操作的等待超时时间。

DDL_LOCK_TIMEOUT

Property Description

Parameter type Integer

Default value 0

Modifiable ALTER SESSION

Range of values 0 to 1,000,000 (in seconds)

Basic No

DDL_LOCK_TIMEOUT specifies a time limit for how long DDL statements will wait in a DML lock queue. The default value of zero indicates a status of NOWAIT. The maximum value of 1,000,000 seconds will result in the DDL statement waiting forever to acquire a DML lock.

If a lock is not acquired before the timeout period expires, then an error is returned.

该参数是oralce 11g中才有的;

实验:

--session 1

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> show parameter ddl

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

ddl_lock_timeout                     integer     0

enable_ddl_logging                   boolean     FALSE

--session 2

SQL> insert into t_1 values('b');

1 row created.

--session 3

SQL> alter table t_1 modify(a varchar2(50));

alter table t_1 modify(a varchar2(50))

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

该错误是执行之后没有等待直接出现;

--session 1

SQL> alter system set ddl_lock_timeout=60;

System altered.

SQL> show parameter ddl

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

ddl_lock_timeout                     integer     60

enable_ddl_logging                   boolean     FALSE

--session 2

SQL> insert into t_1 values('a');

1 row created.

--session 3

SQL> alter table t_1 modify (a varchar2(30));

alter table t_1 modify (a varchar2(30))

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

该错误是在等待了60秒之后才出现;

--session 3

SQL> alter table t_1 add  c number;

则会一直等待下去,直到请求的锁资源被释放(该变量不起作用);

在网上有些文章说,如果是添加列回立即提交,不敢苟同;

---------------------

作者:搞怪的索引

来源:优快云

原文:https://blog.youkuaiyun.com/perfect_db/article/details/9125625

版权声明:本文为博主原创文章,转载请附上博文链接!

Oracle 数据库中并没有直接提供名为 `LOCK_TIMEOUT` 的参数用于设置事务等待锁的超时时间,如在 PostgreSQL 中通过 `statement_timeout` 或 `lock_timeout` 进行配置的方式不同。Oracle 处理锁等待的方式是通过隐式机制和特定的初始化参数来控制事务在获取资源锁时的行为。 然而,在分布式事务环境中,Oracle 提供了一个相关的参数 `distributed_lock_timeout`,用于控制分布式事务在等待锁时的最大等待时间。如果一个事务无法在指定的时间内获得所需的锁,该事务将被回滚,并返回错误信息:"ORA-02049: time-out: distributed transaction waiting for lock" [^2]。这个参数可以动态调整,以适应不同的业务需求。 此外,Oracle 11g 引入了 `DDL_LOCK_TIMEOUT` 参数,它允许 DDL 操作在等待锁时进入等待模式而不是立即失败,这与事务中的锁行为略有不同,但同样体现了 Oracle 对锁管理灵活性的支持 [^3]。 对于非分布式事务或本地事务中的锁等待情况,Oracle 并没有提供直接的 `LOCK_TIMEOUT` 参数。在这种情况下,可以通过应用程序逻辑设计来实现类似的超时机制。例如,在执行可能引起锁竞争的操作之前,可以在应用层设置一个合理的等待时间限制,一旦超过这个时间限制仍未获得锁,则放弃当前操作并通知用户或记录日志以便后续分析。 ### 配置 `distributed_lock_timeout` 要配置 `distributed_lock_timeout` 参数,可以按照以下步骤进行: 1. **查看当前设置**: ```sql SHOW PARAMETER distributed_lock_timeout; ``` 2. **修改参数值(单位为秒)**: - 动态修改(无需重启数据库): ```sql ALTER SYSTEM SET distributed_lock_timeout = 60 SCOPE=BOTH; ``` - 修改后立即生效,适用于所有新的分布式事务。 3. **验证修改结果**: ```sql SHOW PARAMETER distributed_lock_timeout; ``` 通过合理配置 `distributed_lock_timeout` 参数,可以有效管理分布式事务中锁等待的时间,避免长时间阻塞导致系统性能下降或用户体验受损。 ### 使用建议 - 在高并发环境下,适当增加 `distributed_lock_timeout` 的值可以帮助减少因短暂锁冲突引起的事务回滚。 - 对于对响应时间要求较高的应用场景,可以考虑降低此值,以快速失败并提示用户重新尝试操作。 - 应结合具体的业务场景和系统负载情况综合评估参数设置,必要时可通过压力测试验证效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值