You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Developer连接共享疑问:同库不同连接未同步删除数据原因

问题:SQL Developer连接共享机制下,不同连接为何看不到未提交的操作?

我在SQL Developer中针对同一数据库打开了connection1和connection2,在connection1中删除了tableA的所有行(未执行提交或回滚操作),但在connection2中查看时,tableA的所有行仍存在。

根据SQL Developer官方文档说明:

默认情况下,SQL Developer会尽可能共享每个连接。例如,若您在连接导航器中打开一个表,同时使用同一连接打开两个SQL工作表,这三个面板将使用同一个共享数据库连接。在此示例中,一个SQL工作表中的提交操作会在所有三个面板中生效。如果您需要专用会话,必须复制连接并为其指定另一个名称。会话按名称共享,而非连接信息,因此新连接将与原连接保持分离。

既然SQL Developer默认采用连接共享机制,为何connection2中未同步显示connection1的删除操作结果?


解答

这其实是两个核心规则共同作用的结果,咱们一步步理清楚:

  1. 连接共享的前提是「同名连接」
    官方文档里已经划了重点:会话按名称共享,而非连接信息。你创建的connection1和connection2是两个不同名称的连接——哪怕它们指向同一个数据库、用的是同一个账号,SQL Developer也会把它们当成完全独立的数据库会话来处理,根本不会触发连接共享机制。

  2. 数据库事务的隔离特性
    退一步说,就算是共享会话的场景,未提交的操作也只有同会话内可见;而你的情况是两个独立会话,以Oracle(SQL Developer默认适配的数据库)为例,它的默认事务隔离级别是READ COMMITTED,简单来说就是只有提交完成的事务修改,才会被其他会话感知到。

放到你的场景里就是:

  • connection1是一个独立会话,删除操作还处于未提交的事务中,这个修改只在当前会话内部可见;
  • connection2是另一个完全独立的会话,它无法读取connection1未提交的任何操作,自然会显示tableA的原始数据。

如果想验证连接共享的效果,你可以做个小测试:打开connection1,然后在同一个连接下打开两个SQL工作表,在其中一个工作表里删除tableA的行(不提交),切换到另一个工作表查询tableA,这时候你就能看到删除后的结果了——因为它们共享同一个会话,属于同一个事务上下文。

内容的提问来源于stack exchange,提问作者Wolfgang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:55:59