【问题标题】:ORA-08177: can't serialize access for this transactionORA-08177: 无法序列化此事务的访问
【发布时间】:2010-02-27 06:21:45
【问题描述】:

我有一个使用 ADO.NET 的非常简单的代码,它会引发 ORA-08177 异常。我不确定这有什么问题。我在安装了 oracle 32 位客户端的 windows vista 机器上尝试这个。我的 Visual Studio 编译选项设置为 x86 平台。

Dim connection As OracleConnection = Nothing
Dim transaction As OracleTransaction = Nothing

Try
    connection = New OracleConnection("Data Source=ora10;User Id=userid;Password=passwd;")
    connection.Open()

    transaction = connection.BeginTransaction(IsolationLevel.Serializable)

    Dim inputStream As New System.IO.FileStream("Dummy.xls", IO.FileMode.Open)
    Dim fileLength As Integer = CType(inputStream.Length, Integer)
    Dim input(fileLength) As Byte

    Try
        inputStream.Read(input, 0, fileLength)
    Finally
        If inputStream IsNot Nothing Then inputStream.Close()
    End Try

    Dim deleteSql As String = "DELETE FROM TABLE1 WHERE Version = 'v1' "

    Dim cmd As New OracleCommand(deleteSql, connection, transaction)
    cmd.ExecuteNonQuery()

    Dim insertQuery As String = "INSERT INTO TABLE1 (VERSION, DATA) VALUES (:VERSION, :DATA) "
    Dim insertCmd As OracleCommand = New OracleCommand(insertQuery, connection, transaction)
    insertCmd.Parameters.Clear()
    insertCmd.CommandType = Data.CommandType.Text
    insertCmd.Parameters.AddWithValue(":VERSION", "v1")
    insertCmd.Parameters.AddWithValue(":DATA", input)

    insertCmd.ExecuteNonQuery()
    transaction.Commit()

Catch
    If transaction IsNot Nothing Then transaction.Rollback()
    Throw
Finally
    If transaction IsNot Nothing Then transaction.Dispose()
    If connection IsNot Nothing AndAlso connection.State <> ConnectionState.Closed Then connection.Close()
End Try

需要注意的重要一点:(我不确定它们是否已连接)但如果我从我的机器上卸载最新的 Windows 更新,我不会遇到这个问题。

有没有人遇到过这种情况或对这里发生的事情有任何线索?

编辑:-

我取得了一些进展,我发现只有当我们有问题的 blob 列类型时才会出现此问题。对于简单的列,它工作正常。

其他细节(不确定是否有影响)

我正在开发 64 位 windows vista 商务机。 我已经为 windows vista 安装了 32 位 oracle 客户端(因为 64 位 oracle 客户端在 vista 上不起作用)。 我正在 Visual Studio 中为 x86(32 位环境)编译我的项目。 这是一个控制台应用程序,我知道此时没有其他人在访问数据库。所以不能有多个交易。

如果我卸载最新的 Windows 更新,我看不到这个问题。 (KB963027、KB967190、KB959426、KB960225、KB960803、KB952004、KB956572、KB958687、KB958690、KB958481、KB958483、KB943729)

【问题讨论】:

    标签: oracle exception ora-08177


    【解决方案1】:

    您正在使用一个可序列化的事务,它等待某个其他事务将同一个表锁定到ROLLBACK

    如果这个其他事务没有回滚而是提交,你会得到这个错误。

    场景似乎如下:

    1. Alice 打开她的浏览器会话,该会话调用DELETE FROM TABLE1 WHERE Version = 'v1'

      • Bob 打开他的会话,在 Alice 完成之后但在她提交之前调用 DELETE FROM TABLE1 WHERE Version = 'v1'

      Bob 的事务等待,因为AliceVersion = 'v1' 锁定了行

      • Alice 提交她的事务

      • Bob 的交易失败,Cannot serialize access

    要解决此问题,请将TRANSACTION ISOLATION LEVEL 设置为READ COMMITTED

    transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
    

    在这种情况下,Bob 的查询将在Alice 提交她的更改后重新发出,就好像Bob 的事务是在Alice 的事务提交之后开始的一样。

    更新

    能否请您发布您的连接痕迹?

    为此,请在连接后立即发出此命令:

    (New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
    

    ,然后在$ORACLE_HOME\admin\udump 中查找新的*.trc 文件

    【讨论】:

    • 感谢您的回答。当我使用控制台应用程序运行它时,我遇到了这个问题,我知道除了我之外没有其他人在访问该数据库。
    猜你喜欢
    • 2013-01-02
    • 2021-06-10
    • 2022-11-29
    • 2014-04-17
    • 2019-02-02
    • 2013-11-24
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多