事务和锁(二)
时间:2010-09-06 来源:ztz8652
命名事务
可以使用set transaction name 语句为事务指定名称。使用命名事务不仅可以增加程序的可读性,而且可以根据名称对长时间运行的事务进行检测,也可以在日志中根据名称了解事务的工作情况。
下面是一个使用命名事务的实例:
declare
idcard varchar2(50):=’110123aadx9’;
begin
set transaction name ‘inserttransaction’;
--插入员工记录
insert into hrman.employees values(100,’小李’,’男’,’职员’,3600,idcard,5);
end;
/
运行上面的脚本后,执行下面的select语句,可以查看命名事务的基本信息:
select addr,status,start_time,name from v$transacton where name=’inserttransaction’;
嵌套事务和自治事务
Oracle支持嵌套事务,即在一个事务还没有结束时又开始了另一个事务。嵌套事务的内层事务需要定义为自治事务。所谓自治事务即指可以独立对本事务进行提交,但并不影响外层事务,换言之,在自治事务中执行提交操作后,外层事务没有被提交。同样,在外层事务中执行回滚操作也不影响到内层的自治事务。
使用下面的语句可以声明当前事务为自治事务:
pragma autonomous_tansaction;
查看死锁信息
使用v$locked_object试图可以查看当前存在的死锁信息,它的字段属性如表:
字段名 数据类型 说明
XIDUSN NUMBER 回滚段号
XIDSLOT NUMBER 槽号
XIDSQN NUMBER 序列号
OBJECT_ID NUMBER 被锁定的数据库对象的编号
SESSION_ID NUMBER 持有锁的会话编号
ORACLE_USERNAME VARCHAR2(30) oracle用户名
OS_USER_NAME VARCHAR2(30) 操作系统用户名
PROCESS VARCHAR2(12) 操作系统进程编号
LOCKED_MODE NUMBER 锁模式
可以将v$locked_object视图与v$session视图、v$sqltext视图执行连接查询,查看锁对象的基本信息、会话信息和SQL语句信息等,代码如下:
select t2.username,t2.sid,t2.serial#,t2.logon_time,t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid and t2.sql_address=t3.address
order by t2.logon_time;
查看被阻塞的会话信息
使用dba_waiters视图可以查看当前被阻塞的会话信息,它的字段属性如表:
字段名 数据类型 说明
waiting_session number 等待资源的会话
holding_session number 持有资源的会话
lock_type varchar2(26) 锁类型
mode_held varchar2(40) 持有资源的模式
mode_requested varchar2(40) 请求资源的模式
lock_id1 varchar2(30) 锁1的ID
os_user_name varchar2(30) 操作系统用户名
process varchar2(12) 操作系统进程编号
locked_mode number 锁模式
查看死锁中占用资源的会话信息
使用DBA_BLOCKERS视图可以查看死锁中占用资源的会话信息,这些会话并不等待被锁定的资源,但却持有另一个会话等待的数据库对象上的锁。
视图DBA_BLOCKERES包含一个NUMBER类型的字段HOLDING_SESSION,表示持有锁的会话ID。可以通过v$session视图查看该会话的具体信息。
通过结束会话方式接触死锁
如果希望立即解除当前的死锁,释放被锁定的数据库对象,可以使用alter system kill session 语句结束死锁会话,语法如下:
alter system kill session ‘sid,serial#’;