2009-04-24 18 views
8

Tôi có một mã rất đơn giản bằng cách sử dụng ADO.NET mà ném ORA-08177 ngoại lệ. Tôi không chắc điều gì xảy ra với điều này. Tôi đang cố gắng này trên một cửa sổ vista máy có oracle 32 bit khách hàng cài đặt. Tùy chọn biên dịch của tôi cho studio trực quan được đặt thành nền tảng x86.ORA-08177: không thể tuần tự hóa truy cập cho giao dịch này

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 

Điều quan trọng cần lưu ý: (Tôi không chắc chắn nếu chúng được kết nối) nhưng tôi không gặp phải vấn đề này nếu tôi gỡ cài đặt các bản cập nhật cửa sổ mới nhất từ ​​máy của mình.

Có ai phải đối mặt với điều này hoặc có bất kỳ đầu mối nào về những gì đang xảy ra ở đây không?

Chỉnh sửa: -

Tôi có một số tiến bộ mà tôi đã phát hiện ra rằng sự cố này chỉ xảy ra khi chúng tôi có loại cột blob được đề cập. cho các cột đơn giản, nó hoạt động tốt.

Chi tiết khác (không chắc chắn nếu điều đó tạo ra sự khác biệt)

Tôi đang làm việc trên máy tính Windows Vista 64 bit. Tôi đã cài đặt 32 bit oracle client cho windows vista (từ 64 bit oracle client không hoạt động trên vista). Tôi đang biên soạn dự án của mình cho môi trường x86 (32 bit) trong phòng thu trực quan. Và đây là một ứng dụng giao diện điều khiển và tôi biết rằng không ai khác đang nhấn vào cơ sở dữ liệu tại thời điểm này. do đó không thể có nhiều giao dịch.

Và tôi không thấy vấn đề này nếu tôi gỡ cài đặt bản cập nhật cửa sổ mới nhất. (KB963027, KB967190, KB959426, KB960225, KB960803, KB952004, KB956572, KB958687, KB958690, KB958481, KB958483, KB943729)

+0

Ông có thể xin vui lòng gửi một tập tin dấu vết cho bạn phiên? – Quassnoi

+0

Mức cô lập có thể lập lại được? Tôi tự hỏi nếu nó thực sự cần thiết ... –

+0

Phiên bản Oracle nào? – DCookie

Trả lời

19

Bạn đang sử dụng một giao dịch serializable mà chờ đợi đối với một số giao dịch khác khóa cùng một bảng để ROLLBACK.

Nếu giao dịch khác này không khôi phục nhưng cam kết thay vào đó, bạn sẽ gặp phải lỗi này.

Kịch bản có vẻ là như sau:

  1. Alice mở phiên trình duyệt của mình trong đó kêu gọi DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob mở phiên của mình mà gọi DELETE FROM TABLE1 WHERE Version = 'v1' sau Alice đã làm nó nhưng trước khi cô cam kết.

    Bob 'giao dịch của chờ đợi kể từ Alice khóa các hàng với Version = 'v1'

    • Alice cam kết giao dịch của mình

    • Bob' giao dịch không thành công với s Cannot serialize access

Để làm việc xung quanh này, thiết lập TRANSACTION ISOLATION LEVEL-READ COMMITTED:

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted) 

Trong trường hợp này, Bob 'truy vấn s sẽ được cấp lại sau khi Alice cam kết thay đổi của cô, như thể Bob' giao dịch s được bắt đầu sau khi Alice 's một cái đã được cam kết.

Cập nhật

thể bạn xin vui lòng gửi một dấu vết kết nối của bạn?

Để làm điều này, vấn đề lệnh này ngay sau khi kết nối:

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

, sau đó nhìn vào $ORACLE_HOME\admin\udump cho một *.trc tập tin tươi

+0

Cảm ơn câu trả lời của bạn. Tôi đang phải đối mặt với vấn đề này khi tôi đang chạy này bằng cách sử dụng một ứng dụng giao diện điều khiển và tôi biết không có ai khác hơn tôi nhấn cơ sở dữ liệu đó. – MOZILLA

+0

Bạn có thể vui lòng kiểm tra xem sự cố này có tiếp diễn khi bạn thay đổi cấp cô lập giao dịch không? – Quassnoi

+0

Yep giải pháp này hoạt động - giải quyết được vấn đề của tôi – DNKROZ

Các vấn đề liên quan