ORACLE数据库并发访问控制机制及访问冲突的解决方法

2013-11-19 03:39彭小斌张文峰林根深
中国医疗设备 2013年1期
关键词:会话字段视图

彭小斌,张文峰,林根深

南京军区福州总院476临床部信息科,福建 福州 350002

0 前言

作为全球知名的关系型数据库产品,ORACLE数据库以其出色的数据库管理能力、超强的稳定性、良好的并发控制机制而闻名。ORACLE数据库系统本身是一个多用户并发处理系统,任何一个时间节点内都可能有许多用户同时访问和操作同一个数据库对象。因此,并发访问控制是数据库最核心的管理机制之一,也是在数据库运行过程中容易出现错误和故障的地方。本文对ORACLE数据库并发访问控制机制展开探讨,并就实际工作中容易产生的并发性错误提出相应的解决方法。

1 闩锁和锁定机制

ORACLE数据库通过闩锁(latch)和锁定(lock)两种机制来解决并发性访问问题[1]。闩锁是一个低级别、轻量级的锁,获得和释放的速度很快,以类似信号灯的方式实现。锁定可能持续的时间很长,通过使用队列,按照先进先出的方式实现。可以认为闩锁用于微观领域,而锁定用于宏观领域。

1.1 闩锁

ORACLE数据库使用闩锁来管理内存、数据块的分配和释放。当某个用户进程(假定为A)要对一个数据块(block)进行写操作时,将先获得该数据块的闩锁,在其写操作完成之前,该闩锁将被此用户进程独占,此时如果有其他进程(假定为B)试图对此数据块进行写操作,会因无法获得闩锁而被迫进入等待状态,当A进程结束操作时将释放闩锁,B进程可以获得闩锁开始对数据块进行读写操作。闩锁不仅用于数据块读写管理,ORACLE中任何涉及到内存地址的读写操作都要通过获得闩锁来实现串行化,一次只能有一个服务器进程在读或写内存地址[2]。闩锁分两种类型:愿意等待(Willing-To-Wait)和不等待(No-Wait)。大部分闩锁属于第一种类型。当进程无法获得闩锁时,会绕着CPU旋转一段时间(以μs来计算)并再次尝试获得闩锁,当反复旋转CPU并尝试获取闩锁的次数超过某个上限(该上限由隐藏参数控制)时,该进程才会释放CPU并进入睡眠状态,同时产生一个对应的等待事件并记录在视图V$session_wait里。No-Wait型闩锁较少见。当进程请求此类闩锁时,若请求失败,进程将不会旋转CPU而直接转向另一个闩锁的申请。

1.2 锁定

锁定用来控制多用户对数据库表的相同数据的并发访问。锁定分TX锁(TX锁)和表级锁(TM锁)。当用户进程找到被更新数据块的相应数据行时,在其头部设置一个行级锁,并在头部记录当前事务所使用的ITL槽的槽号。其他用户进程如果要更新此数据行的数据,将发现该条记录已经被添加了行级锁而进入等待状态,直到前面的进程完成更新操作并释放TX锁为止。由此可见,TX锁是一种排他锁(X锁),即一旦用户对某个资源添加了X锁,则其他用户都不能对该资源添加任何类型的锁,直到该用户释放了资源上的X锁为止。用户对表数据进行更新时,不仅会在数据行的头部记录行级锁,而且还会在表的级别上添加一个TM锁。TM锁共5种模式[3]:① 行级排他锁(RX锁):DML操作会自动在被更新的表上添加RX锁。该模式允许其他事务通过DML语句修改相同表里的其他数据行,但不允许其他事务对相同的表添加X锁;② 行级共享锁(RS锁):通过select…from

for update语句可以添加RS锁,该锁不允许其他事务对相同的表添加X锁,但允许其他事务通过DML语句锁定相同表里的其他数据行;③ 共享锁(S锁):通过lock table
in share mode命令添加该S锁。该锁不允许任何用户更新表,但允许其他用户对表添加RS锁;④ X锁:通过lock table
in exclusive mode命令添加该X锁,该锁不能对表进行任何的DML和DDL操作,只能对该表进行查询;⑤共享行级排他锁(SRX锁):通过lock table
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.

猜你喜欢
会话字段视图
QQ和微信会话话轮及话轮转换特点浅析
浅谈台湾原版中文图书的编目经验
Can we treat neurodegenerative diseases by preventing an age-related decline in microRNA expression?
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
基于集群节点间即时拷贝的会话同步技术研究①
Django 框架中通用类视图的用法
无正题名文献著录方法评述
无正题名文献著录方法评述