MOZ*_*LLA 14 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
Run Code Online (Sandbox Code Playgroud)
需要注意的重要事项:(我不确定它们是否已连接)但如果我从我的机器上卸载最新的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)
Qua*_*noi 23
您正在使用可序列化的事务,该事务等待锁定同一个表的其他事务ROLLBACK
.
如果此其他事务不回滚而是提交,则会出现此错误.
情景似乎如下:
Alice
打开她调用的浏览器会话 DELETE FROM TABLE1 WHERE Version = 'v1'
Bob
打开他的会话而话费DELETE FROM TABLE1 WHERE Version = 'v1'
后Alice
做到了,但她COMMITED之前.Bob
因为Alice
锁定了行,所以事务会等待Version = 'v1'
Alice
提交她的交易
Bob
交易失败了 Cannot serialize access
要解决此问题,请设置TRANSACTION ISOLATION LEVEL
为READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Bob
在Alice
提交更改之后将重新发出查询,就像在提交Bob
之后启动了事务一样Alice
.
更新
你能发一下你的连线吗?
为此,请在连接后立即发出此命令:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
,然后寻找$ORACLE_HOME\admin\udump
一个新*.trc
文件