标签:数据库操作假死 oracle 表锁定 commit 事务提交
问题: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_id,serial#,记录下来使用如下语句进行解锁
解锁:
alter system kill session‘b.session_id,a.serial#‘;
解锁之后就可以对表进行update操作了,批量操作最容易引起一个事务未结束立马进行下一个事务
要有一个好的习惯:一个事务结束立马提交(提交命令commit;)。
标签:数据库操作假死 oracle 表锁定 commit 事务提交
原文地址:http://guoyongkai.blog.51cto.com/2858734/1599366