问题update 不能更新

19条记录,在更新的时候,偶尔能更新,偶尔就 update 不动了。

更新操作执行的时候,就不动了,好象是死掉一样.


关于数据库事务引起的问题

oracle一个事务没有提交之前,下一个事务是处于挂起状态,通常会出现表被锁定,就是上述的假死状态。

查看被挂起的事务(或者说没有被提交的事务),网上有的说法是查看被锁定的表(我认为此说法不妥,表并没有被锁定,可以进行插入插入等操作)

(用管理员用户登入 sqlplus  / as sysdba)

SELECT p.spid,

      c.object_name,

      b.session_id,

      a.serial#,

      b.oracle_username,

      b.os_user_name

 FROM v$process p, v$session a, v$locked_object b, all_objects c

 WHERE p.addr = a.paddr

  AND a.process = b.process

  AND c.object_id = b.object_id;


以下为例子:

SQL> SELECT p.spid,

 2        c.object_name,

 3        b.session_id,

 4        a.serial#,

 5        b.oracle_username,

 6        b.os_user_name

 7   FROM v$processp, v$sessiona, v$locked_objectb, all_objectsc

 8   WHERE p.addr= a.paddr

 9    AND a.process= b.process

 10   AND c.object_id= b.object_id;


SPID                     OBJECT_NAME                    SESSION_ID    SERIAL#

------------------------------------------------------ ---------- ----------

ORACLE_USERNAME                OS_USER_NAME

------------------------------------------------------------

8070                     DISK_CHECK                            390       3467

SECNET                         root


SQL> alter system killsession'390,3467';


System altered.

这个表中记录了等待被提交的事务,只要“解锁”就可以了


将查询出来的session_idserial#,记录下来使用如下语句进行解锁


解锁:

alter system kill session'b.session_id,a.serial#';


解锁之后就可以对表进行update操作了,批量操作最容易引起一个事务未结束立马进行下一个事务

要有一个好的习惯:一个事务结束立马提交(提交命令commit;)。