【发布时间】:2017-06-21 09:29:33
【问题描述】:
我们有大约 500 个测试,每晚在 Oracle 数据库上运行。
在每次测试之前,我们使用以下代码截断所有表:
public override void EmptyTables()
{
const string alterConstraints = "begin for i in (select c.* from user_constraints c, user_tables u where c.table_name = u.table_name and c.constraint_type = 'R') LOOP EXECUTE IMMEDIATE 'alter table ' || i.table_name || ' {0} constraint ' || i.constraint_name; end loop; end;";
List<string> commandList = new List<string>();
commandList.Add( string.Format( alterConstraints, "disable" ) );
commandList.AddRange( GetTableNames().Select( tn => string.Format( "truncate table {0}", tn ) ) );
commandList.Add( string.Format( alterConstraints, "enable" ) );
ExecuteNonQuery( commandList );
}
public virtual void ExecuteNonQuery( IList<string> statements )
{
DbTransaction dbTransaction = DbConnection.BeginTransaction();
foreach( string statement in statements )
{
DbCommand dbComand = CreateDbCommand( statement, dbTransaction );
dbComand.CommandTimeout = 60 * 30;
try
{
dbComand.ExecuteNonQuery();
}
catch( Exception exception )
{
HandleExecuteNonQueryException( exception, dbTransaction, statement );
}
finally
{
dbComand.Dispose();
}
}
dbTransaction.Commit();
}
几乎每天晚上,这些测试中的一些(约 5 个,随机)在 ExecuteNonQuery 失败,出现 ORA-00060 或 ORA-04020 死锁(语句:alter table SOMETABLE 禁用约束 FK_SOMEFK => 表和 FK 和禁用/启用是随机的以及)。
我知道找出问题可能非常棘手,但可能有人有想法:)
谢谢!
【问题讨论】:
-
最明显的是其他人正在使用该表。在更改表格之前尝试
ALTER SESSION SET DDL_LOCK_TIMEOUT = 60,这样您的等待时间最长可达 60 秒。 -
谢谢,我会尽力告诉你的。
-
不,没有帮助。