Oracle中使用dblink查询时的Exclusive锁

本文通过一次Oracle10g中使用dblink访问其他数据库并创建同义词的实验,揭示了Oracle在执行分布式SQL语句时,即使是SELECT语句也会产生Exclusive锁的现象,并解释了这一现象背后的原因及应对措施。

一次在Oracle 10g中建立了一个dblink用于访问其它数据库,对要访问的数据表在本地数据库创建了一个同义词(Synonyms),然后开始使用select语句测试该同义词是否能正常使用。测试结果显示,select语句成功查询到数据,但无意中发现本地数据中出现了一个Exclusive锁,使用commit语句提交后,该锁就消失了。后来进一步发现,在要访问的数据库中,也会出现一个Exclusive锁,该锁同样在提交后消失。

由于数据库系统刚安装完成,本地数据库也是刚建立的,还没有用户或应用程序使用该数据库,除了刚才的查询操作外,也没有进行其它更新等操作。怀疑是刚才select查询造成的,于是反复进行了几次验证,确认是select查询造成的。

从网上查询后得知,这是Oracle的分布式事务特性引发的。Oracle在执行分布式SQL语句时,无论是查询语句还是DML语句,都被认为是一项事务,为了支持两段式(two-phase)提交处理而使用了回滚段空间。因此,在事务上加了分布式事务锁(DX),只有提交或回滚本次事务后才能解除此锁。如果不提交或回滚本次事务,该事务占用的回滚段空间就不会释放,这样可能造成回滚段空间的不断扩容,从而达到最大限制,甚至耗尽回滚段表空间内的所有可用空间。

切记,在使用分布式SQL语句时,一定要及时提交,查询操作也不例外。即使具有AUMautomatic undo management,自动撤销管理)功能,也不能忽略提交。

 

参考文章:http://www.jlcomp.demon.co.uk/faq/dblink_commit.html

 

         欢迎访问数据库吧http://www.database8.com/?fromuid=13875

<think>首先,用户的问题是:“在Oracle查询dblink OHSABDBS下有哪些表”,意思是“在Oracle查询dblink OHSABDBS下的所有表”。 我需要用中文回答问题,因为用户指定了“请使用中文回答问题”。 关键点是:在Oracle数据库中,查询某个dblink下的所有表。dblinkOracle中的一个数据库链接(database link),它允许访问另一个数据库的对象。 要查询一个dblink下的所有表,我可以使用数据字典视图。特别是,`ALL_TABLES` 或 `DBA_TABLES` 视图,但需要通过dblink来指定远程数据库。 正确的SQL方法是使用 `SELECT * FROM ALL_TABLES@dblink_name;` 或者类似的东西。更精确地说,Oracle提供了 `ALL_TABLES` 视图,结合dblink名称。 标准的查询是: ```sql SELECT table_name FROM all_tables@OHSABDBS; ``` 其中 `OHSABDBS` 是dblink的名称。 或者,使用 `DBA_TABLES@dblink`,但这需要DBA权限。`ALL_TABLES` 通常更适合,因为它显示当前用户有权限访问的表。 用户没有指定权限,所以我应该使用更通用的 `ALL_TABLES`。 完整的SQL示例: ```sql SELECT table_name FROM all_tables@OHSABDBS; ``` 这应该返回远程数据库中的所有表名。 在回答中,我需要提供这个SQL查询,并解释一下。 现在,回答完问题后,我必须提出3-5个 §§相关问题§§。并且第一行必须是完整的 "§§相关问题§§",禁止换行分散。 相关问题应该基于用户的问题和我的回答。用户的问题是查询dblink下的表表名。 所以,可能的§§相关问题§§: 1. 如何创建这样的dblink? 2. 如何查询表的结构或详细信息? 3. 如何列出dblink下的所有对象(不仅仅是表)? 4. 权限相关的问题。 我应该列出3-5个,具体点: 1. 如何在Oracle中创建一个数据库链接? 2. 如何查询dblink下的特定表的列信息? 3. 如何列出dblink下的所有视图或存储过程? 4. 如何检查当前用户对dblink的权限? 5. 如何测试dblink是否正常工作? 确保它们在中文中。 现在,回答的结构: - 先用中文解释如何查询。 - 提供SQL示例。 - 然后,以 "§§相关问题§§" 开头,列出3-5个相关问题。 示例格式提醒: - 回答内容。 - 然后 "§§相关问题§§" - 接着是编号列表。 在我的回答中,问题部分必须输出在末尾。 最终回答: - 解释查询方法。 - 给出SQL代码块(如果需要)。 - 然后 "§§相关问题§§" - 1. ... - 2. ... - 3. ... </think>在Oracle数据库中,要查询数据库链接(dblink)OHSABDBS下的所有表名,可以使用数据字典视图 `ALL_TABLES@dblink_name`。该视图会返回当前用户在该远程数据库链接中有权限访问的所有表名。以下是具体的SQL查询示例: ```sql SELECT table_name FROM all_tables@OHSABDBS; ``` 执行此查询后,将返回一个结果集,含OHSABDBS dblink下的所有表名(例如 `TABLE1`, `TABLE2` 等)。如果查询返回空或无结果,可能表示当前用户没有足够的权限,或者dblink名称有误(需确保大写或正确拼写)。建议在具有适当权限的Oracle会话中运行此语句。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值