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

时间:2009-04-24 13:07:20

标签: oracle exception ora-08177

我有一个非常简单的代码使用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)

1 个答案:

答案 0 :(得分:21)

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

如果此其他事务没有回滚而是提交,则会出现此错误。

情景似乎如下:

  1. Alice打开调用DELETE FROM TABLE1 WHERE Version = 'v1'

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

    Bob的事务等待,因为Alice使用Version = 'v1'锁定行

    • Alice提交交易

    • Bob的交易因Cannot serialize access

    • 而失败
  2. 要解决此问题,请将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文件