Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ems与会话和连接保持同步_Sql_Oracle_Plsql_Oracle11g_Plsqldeveloper - Fatal编程技术网

Sql ems与会话和连接保持同步

Sql ems与会话和连接保持同步,sql,oracle,plsql,oracle11g,plsqldeveloper,Sql,Oracle,Plsql,Oracle11g,Plsqldeveloper,所以请始终执行提交: 从中选择*emp@sales; 承诺 我喜欢阅读较长的章节: 这也让我非常困扰,为什么会有一个关于从db_链接选择的事务 并决定从oracle文档中最终结束此过程: Oracle®数据库管理员指南 11g第2版(11.2) 控制由数据库链接建立的连接 在SQL语句或远程过程调用中引用全局对象名称时,数据库链接将代表本地用户建立到远程数据库中会话的连接。只有在之前尚未为本地用户会话建立连接时,才会创建远程连接和会话 建立到远程数据库的连接和会话在本地用户会话期间保持不变,除

所以请始终执行提交: 从中选择*emp@sales; 承诺

我喜欢阅读较长的章节

这也让我非常困扰,为什么会有一个关于从db_链接选择的事务 并决定从oracle文档中最终结束此过程:

Oracle®数据库管理员指南 11g第2版(11.2)

控制由数据库链接建立的连接 在SQL语句或远程过程调用中引用全局对象名称时,数据库链接将代表本地用户建立到远程数据库中会话的连接。只有在之前尚未为本地用户会话建立连接时,才会创建远程连接和会话

建立到远程数据库的连接和会话在本地用户会话期间保持不变,除非应用程序或用户显式终止它们。请注意,当您通过数据库链接发出SELECT语句时,事务锁将放置在撤消段上。要重新删除该段,必须发出COMMIT或ROLLBACK语句

终止使用数据库链接建立的远程连接对于断开应用程序不再需要的高成本连接非常有用。您可以使用ALTER session语句和CLOSE DATABASE LINK子句终止远程连接和会话。例如,假设您发出以下事务:

从中选择*emp@sales; 犯罪 以下语句终止sales database链接指向的远程数据库中的会话:

SQL> select count(*) from v$transaction; COUNT(1) ---------- 0 SQL> select * from test@loopback_xe; A ---------- 2 1 SQL> select count(*) from v$transaction; COUNT(1) ---------- 1 更改会话关闭数据库链接销售; 要关闭用户会话中的数据库链接连接,必须具有ALTER session system权限

注: 在关闭数据库链接之前,首先关闭使用该链接的所有游标,然后如果当前事务使用该链接,则结束当前事务

另见:
Oracle数据库SQL语言参考,了解有关ALTER SESSION语句的详细信息

@a_horse_with_no_name:。请参阅我的(更新的)答案中的演示。@Pourquoi:请参阅Oracle概念手册:“事务从第一条可执行SQL语句开始。事务在提交或回滚时结束”。我不知道为什么V$交易中没有反映这一点@波奎伊:嗯。。。Oracle需要“某种”事务才能支持读取一致性。将会话设置为serializable V$时,事务实际上会显示一个简单SELECT语句的条目。因此,在读取提交模式下选择的“事务”可能太“弱”,它没有记录在V$transaction中。我认为V$transaction跟踪一个启动SCN。对于可序列化事务,这确实需要包括SELECTs,但如果需要完全回滚,则它应该只是事务可能需要回滚到的点。数据库链接需要提交/回滚才能关闭,所以可能这就是为什么它们需要一个v$事务条目的原因。@a_horse_,带有_no_名称:我认为在读取提交模式下选择不需要事务。为了实现读取一致性,Oracle只需记下它开始运行SELECT查询的时间,如果遇到任何比此更新的数据,就会返回到undo。请参阅《Oracle概念手册》:“事务从第一条可执行SQL语句开始。事务在提交或回滚时结束”。您是对的,但仅供参考,您需要小心从v$transaction进行查询,至少在XE上是这样。某些事务不显示在该视图中。例如,“update a set test=0,其中1=2”并不总是在v$transaction中创建行,但会显示在dbms_transaction.local_transaction_id()中。@Luke_Woodward通过Oracle中的db链接进行的查询会打开一个事务,以支持两阶段提交。您可以查询DBA_2PC_挂起表以查看远程数据库上的条目。当通过db链接进行查询时,我认为发起者无法知道远程db的副作用。您可能正在从函数进行查询,该函数可能会对修改数据产生副作用。我的经验(8i时间范围):在查询之后,但在提交或回滚之前,启动数据库出现故障,导致远程数据库上的事务打开,锁定行,导致其他作业失败。很难找到。@JonHeller显然,在调用
dbms\u transaction.local\u transaction\u id
后,它将出现在
v$transaction
中(或另一个不是
SELECT
的DML语句)。这有点奇怪。美国联邦法规。“SELECT既不是DML也不是DDL”。手册要求有所不同:
SELECT
在这里被明确归类为DML语句。对不起,@a_horse_没有名称,但11g文档明确指出,仅执行常规SELECT(不进行更新)不会启动事务。正如人们所展示的那样——我今天刚刚学到了艰苦的方法——这似乎是真实的行为。我认为文档是自相矛盾的。写DML语句启动事务似乎是不正确的,因为
READ COMMITTED
中的
SELECT
不会启动新事务,但它符合DML的条件。 SQL> select * from test; A ---------- 2 SQL> select count(*) from v$transaction; COUNT(1) ---------- 0 SQL> insert into test values (1); 1 row created. SQL> select count(*) from v$transaction; COUNT(1) ---------- 1 SQL> commit; Commit complete. SQL> select count(*) from v$transaction; COUNT(1) ---------- 0 SQL> create database link loopback_xe connect to user identified by password using 'XE'; Database link created. SQL> select count(*) from v$transaction; COUNT(1) ---------- 0 SQL> select * from test@loopback_xe; A ---------- 2 1 SQL> select count(*) from v$transaction; COUNT(1) ---------- 1
                        ROW Lock    Table lock