Oracle怎么算开始一个会话,oracle – 随机获取ORA-08177只有一个活动会话
我正在運行一個創建一個表然后插入一些數據的程序。
這是訪問數據庫的唯一程序。
我隨機得到ORA-08177。
實際代碼有點復雜,但是我已經編寫了一個簡單的程序來重現這種行為。
using System;
using System.Data;
using Oracle.DataAccess.Client;
namespace orabug
{
class Program
{
private const string ConnectionString = ""; // Valid connection string here
// Recreates the table
private static void Recreate()
{
using (var connection = new OracleConnection(ConnectionString)) {
connection.Open();
using (var command = connection.CreateCommand()) {
command.CommandText = @"
declare
table_count binary_integer;
begin
select count(*) into table_count from sys.user_tables where table_name = 'TESTTABLE';
if table_count > 0 then
execute immediate 'drop table TestTable purge';
end if;
execute immediate 'create table TestTable(id nvarchar2(32) primary key)';
end;";
command.ExecuteNonQuery();
}
connection.Close();
}
}
// Opens session sessionCount times,inserts insertCount rows in each session.
private static void Insert(int sessionCount,int insertCount)
{
for (int sessionNumber = 0; sessionNumber < sessionCount; sessionNumber++)
using (var connection = new OracleConnection(ConnectionString)) {
connection.Open();
using (var transaction = connection.BeginTransaction(IsolationLevel.Serializable)) {
for (int insertNumber = 0; insertNumber < insertCount; insertNumber++)
using (var command = connection.CreateCommand()) {
command.BindByName = true;
command.CommandText = "insert into TestTable (id) values(:id)";
var id = Guid.NewGuid().ToString("N");
var parameter = new OracleParameter("id",OracleDbType.NVarchar2) {Value = id};
command.Parameters.Add(parameter);
command.Transaction = transaction;
command.ExecuteNonQuery();
}
transaction.Commit();
}
connection.Close();
}
}
static void Main(string[] args)
{
int iteration = 0;
while (true) {
Console.WriteLine("Running iteration: {0}",iteration);
try {
Recreate();
Insert(10,100);
Console.WriteLine("No error");
}
catch (Exception exception) {
Console.WriteLine(exception.Message);
}
iteration++;
}
}
}
}
該代碼運行無限循環。
在每次迭代時,它執行以下操作10次:
>打開會話
>使用隨機數據插入100行
>關閉會話
>顯示一條消息,表示沒有發生錯誤
如果發生錯誤,則會捕獲異常并打印其消息
那么執行下一個迭代。
這里是示例輸出。正如你所看到的那樣,ORA-08177隨機地與成功的交互進行交織。
Running iteration: 1
No error
Running iteration: 2
ORA-08177: can't serialize access for this transaction
Running iteration: 3
ORA-08177: can't serialize access for this transaction
Running iteration: 4
ORA-08177: can't serialize access for this transaction
Running iteration: 5
ORA-08177: can't serialize access for this transaction
Running iteration: 6
ORA-08177: can't serialize access for this transaction
Running iteration: 7
No error
Running iteration: 8
No error
Running iteration: 9
ORA-08177: can't serialize access for this transaction
Running iteration: 10
ORA-08177: can't serialize access for this transaction
Running iteration: 11
ORA-08177: can't serialize access for this transaction
Running iteration: 12
ORA-08177: can't serialize access for this transaction
Running iteration: 13
ORA-08177: can't serialize access for this transaction
Running iteration: 14
ORA-08177: can't serialize access for this transaction
Running iteration: 15
ORA-08177: can't serialize access for this transaction
Running iteration: 16
ORA-08177: can't serialize access for this transaction
Running iteration: 17
No error
Running iteration: 18
No error
Running iteration: 19
ORA-08177: can't serialize access for this transaction
Running iteration: 20
No error
我正在運行Oracle 11.1.0.6.0并使用ODP.NET 2.111.6.20。
將隔離級別更改為ReadCommited修復了問題,但我真的想在Serializable級別運行此級別。
看起來像I’m not alone
有了這個問題,但答案沒有給出,所以我再問一次。
我做錯了什么,我該怎么解決這個問題?
由APC編輯
為了防止任何人咆哮錯誤的樹,發布的代碼示例只是ORA-8177錯誤的生成器。顯然實際代碼是不同的;具體來說,丟棄和重建桌子是一個紅色的鯡魚。
總結
以上是生活随笔為你收集整理的Oracle怎么算开始一个会话,oracle – 随机获取ORA-08177只有一个活动会话的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle删错表了怎么办,Oracle
- 下一篇: oracle 空间数据字段,Oracle