in share row exclusive mode命令添加SRX锁,该锁不能对相同的表进行DML操作,也不能添加共享锁。2 锁定的相关视图
ORACLE数据库借助以下几个数据字典来管理锁定问题[4]:
(1)V$transaction:该视图记录当前每个活动事务的信息。其中比较重要的字段包括XIDUSN(当前事务使用的回滚段的编号)、XIDSLOT(事务在回滚段头部的事务表中对应的记录编号)、XIDSQN(序列号)。
(2)V$lock:该视图记录了当前对话已经获得的锁定以及正在请求的锁定信息。其中比较重要的字段包括SID(session的ID号)、TYPE(锁定的类型和级别)、REQUEST(正在请求的锁定模式)、BLOCK(是否阻止了其他用户获得锁定)。
(3)V$locked_object:该视图记录当前已经被锁定的对象信息,其中比较重要的字段包括XIDUSN(当前事务使用的回滚段的编号)、XIDSLOT(事务在回滚段头部的事务表中对应的记录编号)、XIDSQN(序列号)、OBJECT_ID(当前被锁定对象的ID),LOCKED_MODE(锁定模式的数字编码))。
(4)V$session:记录当前session的相关信息。其中比较重要的字段包括SID(session编号)、SERIAL#(序列号),SID和SERIAL#共同标识一个session。
3 并发访问冲突的现象、原因、检测和解决方法
3.1 并发访问冲突的现象
笔者所在的单位是一所部队医院,运行的是“军卫一号”医院信息系统,该系统以ORACLE为数据库管理系统(目前版本是10g),开发环境是PowerBuilder9.0,并发用户数在400台左右。在长期的数据库维护管理工作中,笔者经常遇到并发访问冲突的问题。表现为:某一台或几台机的用户在进行程序操作特别是进行数据保存时死机(鼠标呈沙漏状),此时系统不会有任何错误提示,若用户强行结束任务后重新进行上述操作仍然失败,最极端的情况是所有写某个数据表的用户都会死机。
3.2 原因
造成上述访问冲突的原因一般有以下两种[5]:
(1)应用程序中的BUG。PowerBuilder经常通过数据窗口技术(datawindow)来实现对数据的读写。当数据窗口完成一次数据更新后,要通过resetupdate()函数来进行数据窗口更新状态的复位。否则数据窗口在进行多次数据读写操作后很容易出现更新数据但不提交的现象(即对某数据表UPDATE后没有COMMIT),当其他用户或程序也对该表的相同行数据进行写操作时,就会把用户锁定。
(2)客户端的电脑故障。当客户端对数据表进行读写操作时,如果此时客户端电脑发生故障,如WINDOWS系统死机等,此时该用户的COMMIT动作没有完成。其他用户如果也在访问该表的相同数据行,则很容易产生锁定。
3.3 检测和解决方法
笔者通过一个具体的例子来阐述并发访问冲突的解决方法。假设A用户在SQL_PLUS中执行语句:update dept_dict set dept_name=’aaa’ where dept_code=’1001’;然后B用户执行语句:update dept_dict set dept_name=’bbb’ where dept_code=’1001’, 此 时 B 用 户 的SQL语句运行将出现死机。当执行select * from v$locked_object语句,查出当前被锁住会话的session_ID是9和11。再执行语句 select sid、type、ID1、ID2、lmode、request、block from v$lock where sid in(9,11),查询结果,见表1。
表1 解决并发访问冲突实例的查询结果
从表1可知,A用户的SQL语句(即SID=9的会话)已经在DEPT_DICT表中添加了TX锁和TM锁,当B用户执行自己的SQL语句(即SID=11的会话)时也往该表的同一条记录添加TX锁和TM锁。TM锁添加成功,添加TX锁时由于该行记录已被A用户的会话锁住且尚未释放,所以添加失败,因此第4行记录的Lmode字段值为0,表示TX锁未添加成功,同时第1行记录的Block字段值为1,表示sid=9的会话的TX锁阻止了其他用户获得此锁。查明是由于sid=9的会话阻塞了sid=11的会话获得锁定后,我们就可以进行解锁操作了。通常的解锁操作有两种:一种是将前面会话的SQL操作正常提交,即运行COMMIT语句,当A用户的SQL操作完成后自动会将TX锁和TX排他锁释放,B用户即可获得该条记录的TX锁并完成自己的SQL操作。第二种方法是将前面会话删掉,此方法用于前面会话已经无法正常提交的情况。以本例而言,可执行语句:select sid,serail#from v$session where sid=9,查出sid=9的会话serial#=189;然后运行语句:alter system kill session(9,189),将A用户的会话强行删除,该会话自动释放TX锁和TM锁,这样B用户即可获取相应锁并完成自己的SQL操作。
4 结束语
综上所述,ORACLE数据库主要是通过闩锁和锁定机制来实现对数据库并发访问的控制,前者基于内存和数据块层面,属微观范畴;后者基于数据表和记录,属宏观领域。同时ORACLE提供了若干数据字典和视图,方便数据库管理员(DBA)实时了解数据库当前的用户连接和锁定状况,共同为ORACLE用户提供强大的并发控制机制和高效的并发管理能力。
[1]余钢,朱莉,张云睿.ORACLE DML封锁等待原因分析和应用中的处理方法[J].电脑知识与技术,2005,(10):42-43.
[2]萨师煊,王珊.数据库系统概论[M].3版.北京:高等教育出版社,2000.
[3]沈金发,郑甫京,王令赤,等.ORACLE关系数据库系统[M].北京:清华大学出版社,1992.
[4]韩思捷.ORACLE数据库技术实用详解[M].北京:电子工业出版社,2008.
[5]滕永昌.ORACLE9I数据库管理员使用大全[M].北京:清华大学出版社,2004.
[6]周芃,顾凤军,周昕.ORACLE闪回技术的使用与分析[J].中国医疗设备,2009,24(2):51-53.
[7]刘志敏,刘微.Oracle数据库日志挖掘工具的利用[J].中国医疗设备,2008,23(1):29-30.