【问题标题】:ODP.NET - disable auto commitODP.NET - 禁用自动提交
【发布时间】:2016-01-13 13:50:55
【问题描述】:

在使用 ODP.NET 时,是否有一种简单的方法可以禁用自动提交?我想使用 SET TRANSACTION 命令开始事务,而不是使用 Connection.BeginTransaction 和 TransactionScope。此外,我希望任何 DML 启动事务(如果尚未启动)但在发出 COMMIT 命令之前不提交更改。我知道其他 Oracle 提供程序(JDBC 或 Devart)支持这一点,但我想用 ODP.NET 实现相同的行为。

我还发现在 ODP.NET 的托管版本中可能存在私有字段,但它隐藏在难以通过 OracleConnection 实例访问的物理连接的实现中。在非托管版本中,此设置似乎也在 Oracle.DataAccess.dll 程序集之外。

【问题讨论】:

  • 不是我的领域,而是: 要执行显式事务,首先通过调用 BeginTransaction 方法从 OracleConnection 对象获取 OracleTransaction 对象。请注意,这是获取交易对象的唯一方法。从这里:http://www.oracle.com/au/products/database/o39odpnet-087387.html
  • 这只是简单描述如何使用连接对象上的调用方法来控制事务。我不想要那个。我希望在发布第一个 DML 时不提交事务,而无需使用 BeginTransaction/new TransactionScope 显式启动事务。基本上是默认的 SQL*Plus 行为。
  • 你不喜欢Connection.BeginTransaction有什么原因吗?
  • 我有自己的 SQL 编辑器,您可以在其中执行任何临时 SQL 命令,如果我想使用 SET TRANSACTION 启动事务,我需要显式检查将要执行的每个命令,如果它是 SET TRANSACTION,我需要在 BeginTransaction 中选择哪个隔离级别作为参数。并不是说该方法不支持只读。当然,实际这样做不是问题,但我不喜欢这样的解决方案。尤其是当其他提供商有 AutoCommit 设置时。

标签: c# oracle transactions odp.net odp.net-managed


【解决方案1】:

使用 ODP.NET 禁用自动提交的唯一方法是使用 BeginTransaction/new TransactionScope。

您可以在 UI 中向用户明确说明默认情况下自动提交是打开的,如果关闭,他们可以通过单击工具栏按钮等方式关闭,此时您可以使用可以放置在属性中的一些选项来调用 Begin Transaction或选项页面。

这正是我们在查询窗口中使用 Oracle 开发人员工具所做的事情。

另一个可能要研究的事情是匿名 PL/SQL 一次发送一个 SQL 语句块。

至于“SET TRANSACTION”,如果您已经完成“BeginTransaction”,我不确定它是否会产生影响,但如果是这种情况,您可以证明该命令不受支持(我们必须这样做如果是这样,在我们的查询窗口中也是如此)。

如果您希望 ODP.NET 在未来某个日期使用此功能得到增强,您可能需要在 ODP.NET 功能请求页面提出请求:

http://apex.oracle.com/pls/apex/f?p=18357:46

【讨论】:

  • 谢谢。我在那里添加了缺少的功能(不仅仅是这个:-))。尽管我认为这个解决方案(我已经使用它)更多地是一种解决方法,而不是正确的解决方案,但答案是被接受的。我不能使用匿名块,因为我不想执行与编辑器中编写的语句不同的语句。
猜你喜欢
  • 2016-05-06
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多