programing

ORA-08177: 이 트랜잭션에 대한 액세스를 직렬화할 수 없습니다.

telebox 2023. 6. 21. 22:31
반응형

ORA-08177: 이 트랜잭션에 대한 액세스를 직렬화할 수 없습니다.

저는 ORA-08177 예외를 발생시키는 ADO.NET을 사용하는 매우 간단한 코드를 가지고 있습니다.저는 이것이 무엇이 문제인지 잘 모르겠습니다.나는 오라클 32비트 클라이언트가 설치된 윈도우 비스타 기계에서 이것을 시도하고 있습니다.비주얼 스튜디오용 컴파일 옵션은 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 업데이트를 제거해도 이 문제가 발생하지 않습니다.

이것에 직면했거나 여기서 무슨 일이 일어나고 있는지 아는 사람이 있습니까?

편집:-

저는 이 문제가 문제의 블롭 컬럼 유형을 가지고 있을 때만 발생한다는 것을 알게 된 부분에 대해 진전이 있습니다.단순 열에 대해서는 잘 작동합니다.

기타 세부 정보(그것이 차이를 만드는지 확실하지 않음)

저는 64비트 윈도우 비스타 비즈니스 머신에서 일하고 있습니다.Windows Vista용으로 32비트 Oracle 클라이언트를 설치했습니다(vista에서는 64비트 Oracle 클라이언트가 작동하지 않으므로).저는 비주얼 스튜디오에서 x86(32비트 환경) 프로젝트를 컴파일하고 있습니다.이것은 콘솔 애플리케이션이며 현재 아무도 데이터베이스에 접속하지 않고 있습니다.여러 개의 트랜잭션이 있을 수 없습니다.

최신 Windows 업데이트(KB963027, KB967190, KB959426, KB960225, KB960803, KB952004, KB956572, KB958687, KB958690, KB958481, KB958483, KB943729)를 제거해도 이 문제가 나타나지 않습니다.

동일한 테이블을 잠그는 다른 트랜잭션을 기다리는 직렬화 가능 트랜잭션을 사용하고 있습니다.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

이 문제를 해결하려면 설정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

언급URL : https://stackoverflow.com/questions/785765/ora-08177-cant-serialize-access-for-this-transaction

반응형