【问题标题】:ORA-08177: can't serialize access for this transaction - Oracle 11gORA-08177: 无法序列化此事务的访问 - Oracle 11g
【发布时间】:2013-01-02 00:56:30
【问题描述】:

我正在为 PHP 应用程序使用 ADOdb 库。

此应用程序在 Oracle 9g 上运行顺畅,但当我们将其转移到新服务器时,它经常抛出以下错误:

ORA-08177: 无法序列化此事务的访问

我使用的 oci_8.dll 可能有问题吗?我应该将其更新为 php_oci8_11g.dll 吗?

【问题讨论】:

  • 尽管下面的答案很好,但我鼓励在使用 Oracle 11g 时将驱动程序的 dll 更新到 11g。

标签: php oracle oracle11g


【解决方案1】:

如果您的隔离级别设置为 serializable 并且您正在对其他人也在执行 DML 的表执行 DML,则会发生此错误。

您是否设置了这样的隔离级别 + 进行 DML,如果是,为什么标准 read committed 不适合您?

例如:

有人删除了一行

ANOTHER SESSION                   YOUR SESSION

SQL> delete from a where id = 1;

1 row deleted.

提交尚未完成..同时,您的 SERIALIZED 事务尝试删除同一行...

SQL> alter session set isolation_level=serializable;

Session altered.

SQL> delete from a where id = 1;

此时您的会话将挂起,因为其他会话已锁定。 如果该其他会话现在提交:

SQL> commit;        

Commit complete.  

您的会话遇到了该错误:

delete from a where id = 1
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction

【讨论】:

  • 感谢 DazzaL。事情是这样的:我们确实将隔离级别更改为 READ COMMITTED。但是,当我们决定通过同时为同一个客户开具发票来测试其效率时,我们发现同一张发票使用相同的发票编号被开出两次,因为发票的编号是通过获取 MAX 发票编号生成的当时。因此,通过在两台不同的机器上运行相同的程序,返回给两者的 MAX 发票号码是相同的号码!
  • 无论如何,问题是这段代码在带有 SERIALIZABLE 的 9g 中运行顺利,而现在在 11g 中却没有。那么,这是否可能意味着 9g 设置为 SERILIZABLE 模式?
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 2022-11-29
  • 2014-04-17
  • 2019-05-17
  • 2019-02-02
  • 1970-01-01
  • 2013-11-24
  • 2019-08-15
相关资源
最近更新 更多