这是因为truncate操作的表有事务还在执行,没有提交结束,此时可以通过查询v$locked_object得到具体是哪些用户的事务正在操作这张表。

实验模拟
首先用scott用户进入数据库中,对已经存在的表t1进行下面的操作:
SQL> delete from t1 where name like '%C%';
23308 rows deleted.
注意,这里并没有执行commit进行提交。
然后在另外的session中,以dba身份进行数据库,操作:
SQL> truncate table scott.t1;
truncate table scott.t1
                     *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
故障重现了。
针对这样的问题,下面用dba身份进行如下操作:
首先确定操作对象的object_id:
SQL> select object_id from dba_objects where object_name='T1';
OBJECT_ID
  ----------
     52505
SQL> select object_id,session_id,oracle_username,os_user_name,process,locked_mode from v$locked_object where object_id=52505;
OBJECT_ID SESSION_ID ORACLE_USERNAME  OS_USER_NAME  PROCESS  LOCKED_MODE
   --------- ---------- ---------------- ------------- -------- -----------
     52505    149            SCOTT        oracle      5333         3
由上面可见,正是SID为149的用户scott在操作此表,可以通过查询v$session得到详细信息:
SQL> select sid,serial#,username,process from v$session where sid=149;
       SID    SERIAL# USERNAME        PROCESS
   --------- ---------- -------------- ------------
       149   136        SCOTT        5333
那么,如果操作允许,可以将该事务kill掉:
SQL> alter system kill session '149,136';
然后再执行truncate操作即可。

注:简单的将上面的语句整合了下
select sid,serial#,username,process from v$session where sid=(select session_id from v$locked_object where object_id=(select object_id from dba_objects where object_name='&table_name'));