SQL Developer连接共享疑问:同库不同连接未同步删除数据原因
我在SQL Developer中针对同一数据库打开了connection1和connection2,在connection1中删除了tableA的所有行(未执行提交或回滚操作),但在connection2中查看时,tableA的所有行仍存在。
根据SQL Developer官方文档说明:
默认情况下,SQL Developer会尽可能共享每个连接。例如,若您在连接导航器中打开一个表,同时使用同一连接打开两个SQL工作表,这三个面板将使用同一个共享数据库连接。在此示例中,一个SQL工作表中的提交操作会在所有三个面板中生效。如果您需要专用会话,必须复制连接并为其指定另一个名称。会话按名称共享,而非连接信息,因此新连接将与原连接保持分离。
既然SQL Developer默认采用连接共享机制,为何connection2中未同步显示connection1的删除操作结果?
这其实是两个核心规则共同作用的结果,咱们一步步理清楚:
连接共享的前提是「同名连接」
官方文档里已经划了重点:会话按名称共享,而非连接信息。你创建的connection1和connection2是两个不同名称的连接——哪怕它们指向同一个数据库、用的是同一个账号,SQL Developer也会把它们当成完全独立的数据库会话来处理,根本不会触发连接共享机制。数据库事务的隔离特性
退一步说,就算是共享会话的场景,未提交的操作也只有同会话内可见;而你的情况是两个独立会话,以Oracle(SQL Developer默认适配的数据库)为例,它的默认事务隔离级别是READ COMMITTED,简单来说就是只有提交完成的事务修改,才会被其他会话感知到。
放到你的场景里就是:
connection1是一个独立会话,删除操作还处于未提交的事务中,这个修改只在当前会话内部可见;connection2是另一个完全独立的会话,它无法读取connection1未提交的任何操作,自然会显示tableA的原始数据。
如果想验证连接共享的效果,你可以做个小测试:打开connection1,然后在同一个连接下打开两个SQL工作表,在其中一个工作表里删除tableA的行(不提交),切换到另一个工作表查询tableA,这时候你就能看到删除后的结果了——因为它们共享同一个会话,属于同一个事务上下文。
内容的提问来源于stack exchange,提问作者Wolfgang

