如何通过Oracle SQL语句修改全局数据库超时时长
Oracle 全局锁超时配置方法
Oracle 不存在和 MySQL LOCK_TIMEOUT 完全同名的全局参数,锁相关超时配置根据场景分为两类,配置方式如下:
查询当前全局超时参数
通过系统视图查询当前实例生效的锁超时配置,执行以下SQL即可:
-- 查询DDL锁等待超时(单位:秒,默认值0代表无超时、无限等待) SELECT name, value, description FROM v$parameter WHERE name = 'ddl_lock_timeout'; -- 查询分布式事务锁等待超时(单位:秒,默认值60) SELECT name, value, description FROM v$parameter WHERE name = 'distributed_lock_timeout';
修改全局超时配置
Oracle 修改全局生效的系统参数使用 ALTER SYSTEM 语法,可以通过SCOPE参数指定生效范围:
SCOPE=BOTH:立即在当前运行实例生效,同时写入参数文件,数据库重启后配置依然保留(要求数据库使用SPFILE启动,为最常用配置方式)SCOPE=MEMORY:仅在当前实例运行期间生效,数据库重启后失效SCOPE=SPFILE:仅写入参数文件,不会立即生效,下次数据库重启后生效
注意:Oracle所有锁超时全局参数的单位均为秒,而MySQL的
LOCK_TIMEOUT单位为毫秒,设置时需要做单位换算。例如MySQL示例中设置的10000毫秒对应10秒,Oracle配置时参数值需要填10。
以设置DDL锁超时为10秒(对应示例中10000毫秒的配置目标)为例,配置语句如下:
-- 立即生效并持久化配置 ALTER SYSTEM SET ddl_lock_timeout = 10 SCOPE=BOTH; -- 修改完成后可再次执行查询语句验证配置结果 SELECT name, value FROM v$parameter WHERE name = 'ddl_lock_timeout';
补充说明
普通DML语句(INSERT/UPDATE/DELETE)的锁等待,Oracle全局层面默认无超时限制,会一直等待直到持有锁的事务提交/回滚。如果需要控制单条DML的锁等待时长,可以在语句中加hint指定,例如:
-- 该UPDATE语句最多等待10秒锁,超时直接抛出错误 UPDATE /*+ WAIT(10) */ test_table SET col1 = 'test' WHERE id = 1;
内容的提问来源于stack exchange,提问作者Ramazan E.
相关产品推荐
相关产品推荐

