简述对oracle事务管理的理解,Oracle并发控制、事务管理学习笔记

(e)表级锁定和行级锁定

在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当发布一个insert、update、 delete、select......for update语句时都会自动在被操作的表上加表级别的锁(即TM类型的锁)。也可以用Lock Table语句专门设置一个表级别的锁。表级别的锁被用于在操作表中数据期间(还没提交或回退事务),防止其他用户对表的结构进行更改。

Lock Table语句的语法是:LOCK TABLE [schema.]table_name IN lock_mode MODE [NOWAIT];

lock_mode表示锁的模式,取值是SHARE、ROW SHARE、ROW EXCLUSIVE、SHARE ROW EXCLUSIVE、EXCLUSIVE;

当发布一个insert、update、 delete、select......for update语句时都会自动在被操作的行上加行级别的锁(即TX类型的锁)。行级别的锁被用于在操作表中数据期间(还没提交或回退事务),防止其他用户对正在操作的行的数据进行更改。

当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。要想获得某个表上的TX锁,事务必须首先获得该表上的TM锁。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可。TM锁包括了SS、SX、S、SSX、X 等多种模式,在数据行上只有X锁(排他锁)。

在Oracle中,查询(不带for update子句的select语句)语句不会锁定数据。即使一个事务已经锁定了几行记录或整个表,查询总是不需要为加锁而等待的。Oracle的查询是通过使用在撤销表空间中所存储的、数据被锁定之前的前映像,来不需要等待地、成功地执行的。这种读取前映像的方法提高了数据的并发度,还保证了事务不会读取到脏数据。

Select...For Update语句所加的锁与update语句所加的锁相同:一个行级别的EXCLUSIVE锁、一个表级别的ROW EXCLUSIVE锁。

Select...for update of column_list, 在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。这种情况经常会出现在用户对带有连接查询的视图进行操作场景下。用户只锁定相关表的数据,其他用户仍然可以对视图中其他原始表的数据来进行操作。

在Oracle中,锁的数量不受限制且不会自动升级。(有些数据库中,某个表上的行级锁达到一定数量后,这些行级锁就会被升级为该表上的1个表级锁,而取消这些行级锁)

(f)与锁相关的数据字典

V$LOCK视图/DBA_LOCKS视图:所有会话保持或申请的锁的信息

V$LOCKED_OBJECT视图:所有会话锁定的对象以及使用的锁的模式

DBA_WAITERS视图:显示所有被阻塞会话及其申请的锁和阻塞该会话的会话保持的锁的信息

DBA_BLOCKERS视图:显示阻塞了其他会话的那些会话

V$LOCK视图的各个列的说明如下:

列名 数据类型 说明

ADDR RAW(4) 在内存中锁定的对象的地址

KADDR RAW(4) 在内存中锁的地址

SID NUMBER 保持或申请锁的会话的标识号

TYPE VARCHAR2(2) 锁的类型:TX=行锁或事务锁;TM=表锁或DML锁;UL=PL/SQL用户锁

ID1 NUMBER 锁的第1标识号。TM锁,该值表示将要被锁定的对象的标识号;TX锁,该值表示撤销段号码的十进制值

ID2 NUMBER 锁的第2标识号:TM锁,该值为0;TX锁,该值表示交换次数

LMODE NUMBER 会话保持的锁的模式。0=None;1=Null;2=Row-S (SS);3=Row-X (SX);

4=Share;5=S/Row-X (SSX);6=Exclusive

REQUEST NUMBER 会话申请的锁的模式。与LMODE中的模式相同

CTIME NUMBER 以秒为单位的,获得当前锁(或转换成当前锁的模式)以来的时间

BLOCK NUMBER 当前锁是否阻塞另一个锁。0=不阻塞;1=阻塞

(g)死锁

当Oracle检测到死锁后,会在跟踪文件中记录下死锁的信息。

Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、错误消息等。在数据库出现故障时,应首先查看该文件,但文件中的信息与任何错误状态没有必然的联系。后台报警日志文件保存BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为AL

alert_SID.log。

另一种类型是DBWR、LGWR、SMON等后台进程创建的后台跟踪文件。后台跟踪文件根据后台进程运行情况产生,后台跟踪文件也保存在BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为siddbwr.trc、sidsmon.trc等。

还有一种类型是由连接到Oracle的用户进程(Server Processes)生成的用户跟踪文件。这些文件仅在用户会话期间遇到错误时产生。

此外,用户可以通过执行oracle跟踪事件(见后面)来生成该类文件,用户跟踪文件保存在USER_DUMP_DEST参数指定的目录中,文件格式为oraxxxxx.trc,xxxxx为创建文件的进程号(或线程号)。

例如:

1

SQL> SELECT USERENV('SID') FROM DUAL;

USERENV('SID')

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

120

SQL> CREATE TABLE T1(COL CHAR);

Table created.

SQL> CREATE TABLE T2(COL CHAR);

Table created.

SQL> INSERT INTO T1 VALUES('A');

1 row created.

SQL> INSERT INTO T2 VALUES('A');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT USERENV('SID') FROM DUAL;

USERENV('SID')

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

126

2

SQL> UPDATE T1 SET COL='B' WHERE COL='A';

1 row updated.

3

SQL> UPDATE T2 SET COL='B' WHERE COL='A';

1 row updated.

4

SQL> UPDATE T1 SET COL='B' WHERE COL='A';

5

SQL> UPDATE T2 SET COL='B' WHERE COL='A';

6

UPDATE T1 SET COL='B' WHERE COL='A'

*

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

SQL>

用sys账户登陆,

SQL> SHOW PARAMETER BACKGROUND_DUMP_DEST;

NAME TYPE VALUE

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

background_dump_dest string e:/app/ww/diag/rdbms/mytest/mytest/trace

打开E:/app/ww/diag/rdbms/mytest/mytest/trace/alert_mytest.log,最后面有如下记录:

Thu May 19 09:41:00 2011

ORA-00060: Deadlock detected. More info in file e:/app/ww/diag/rdbms/mytest/mytest/trace/mytest_ora_684.trc.

打开mytest_ora_684.trc可以看到详细死锁信息

(f) 检测锁争用

上面例子,第6步中oracle检测到死锁并产生ORA-00060错误放弃了会话126的第4步update操作后,会话120的第5步的表T2更新操作依然需要等待会话126的第3步的表T2更新操作提交或者回滚。可以用如下的SQL语句来查询阻塞的会话。

SQL>SETLINESIZE 120;

SQL>COLUMNBLOCKERS FORMAT A20;

SQL>COLUMNWAITERS FORMAT A50;

SQL>SELECTSB.SID||':'||SB.SERIAL#||' '||SB.USERNAME BLOCKERS,

2         SW.SID||':'||SW.SERIAL#||' '||SW.USERNAME||' '||SQLW.SQL_TEXT WAITERS

3FROMV$LOCK LB, V$LOCK LW, V$SESSION SB, V$SESSION SW, V$SQLAREA SQLW

4WHERELB.ID1=LW.ID1

5ANDLB.BLOCK=1

6ANDLW.BLOCK=0

7ANDLB.SID=SB.SID

8ANDLW.SID=SW.SID

9ANDSW.SQL_ID=SQLW.SQL_ID;

BLOCKERS             WAITERS

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

170:6 HR             155:14 HRUPDATET2SETCOL='B'WHERECOL='A'

SQL>

SQL> SET LINESIZE 120;

SQL> COLUMN BLOCKERS FORMAT A20;

SQL> COLUMN WAITERS FORMAT A50;

SQL> SELECT SB.SID||':'||SB.SERIAL#||' '||SB.USERNAME BLOCKERS,

2 SW.SID||':'||SW.SERIAL#||' '||SW.USERNAME||' '||SQLW.SQL_TEXT WAITERS

3 FROM V$LOCK LB, V$LOCK LW, V$SESSION SB, V$SESSION SW, V$SQLAREA SQLW

4 WHERE LB.ID1=LW.ID1

5 AND LB.BLOCK=1

6 AND LW.BLOCK=0

7 AND LB.SID=SB.SID

8 AND LW.SID=SW.SID

9 AND SW.SQL_ID=SQLW.SQL_ID;

BLOCKERS WAITERS

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

170:6 HR 155:14 HR UPDATE T2 SET COL='B' WHERE COL='A'

SQL>

当出现检测到锁争用的信息后,用户自己(执行commit语句或rollback语句,使事务结束,释放所加的锁。还可以使用 ALTER SYSTEM KILL SESSION 'sid, serial#' 语句来杀死会话,强行解决锁争用。

(g) Oracle中的事务和SQLServer中的事务的差异

事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异。

事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的一个问题,对这个问题的疏忽可能会导致应用程序逻辑错误以及效率低下。

下面我们针对Oracle及SQL Server这 两种当前广泛使用的大型数据库产品,探讨一下它们在事务处理方面的一些差异。如没有特殊说明,本文内容适用的数据库产品版本为Oracle9i及SQL Server 2000,其中的示例SQL语句,对于Oracle是在SQL*Plus中执行,而对于SQL Server 2000是在osql中执行。

一.事务的概念

事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。事务的一个典型例子是银 行中的转帐操作,帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数 量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转帐操作中的两个步骤就构成一个事务。

数据库中的事务还有如下ACID特征。

ACID分别是四个英文单词的首写字母,这四个英文单词是Atomicity、Consistency、Isolation、Durability,分别翻译为原子性、一致性、隔离性、持久性。

原子性:指事务中的操作,或者都完成,或者都取消。

一致性:指事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。

隔离性:指当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。

持久性:指对事务发出COMMIT命令后,即使这时发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。

对数据库中的数据修改都是在内存中完成的,这些修改的结果可能已经写到硬盘也可能没有写到硬盘,如果在操作过程中,发生断电或系统错误等故障, 数据库可以保证未结束的事务对数据库的数据修改结果即使已经写入磁盘,在下次数据库启动后也会被全部撤销;而对于结束的事务,即使其修改的结果还未写入磁 盘,在数据库下次启动后会通过事务日志中的记录进行“重做”,即把丢失的数据修改结果重新生成,并写入磁盘,从而保证结束事务对数据修改的永久化。这样也 保证了事务中的操作要么全部完成,要么全部撤销。

二.事务设置及类型的区别

在SQL Server中有三种事务类型,分别是:隐式事务、显式事务、自动提交事务,缺省为自动提交。

自动提交,是指对于用户发出的每条SQL语句,SQL Server都会自动开始一个事务,并且在执行后自动进行提交操作来完成这个事务,也可以说在这种事务模式下,一个SQL语句就是一个事务。

显式事务,是指在自动提交模式下以Begin Transaction开始一个事务,以Commit或Rollback结束一个事务,以Commit结束事务是把事务中的修改永久化,即使这时发生断电这样的故障。例如下面是SQL Server中的一个显式事务的例子。

Begin TranUpdate emp Set ename=’Smith’ Where empno=7369

Insert Into dept Values(60,’HR’,’GZh’)Commit

隐式事务,是指在当前会话中用Set Implicit_Transactions On命令设置的事务类型,这时任何DML语句(Delete、Update、Insert)都会开始一个事务,而事务的结束也是用Commit或Rollback。

在Oracle中没有SQL Server的这些事务类型,缺省情况下任何一个DML语句都会开始一个事务,直到用户发出Commit或Rollback操作,这个事务才会结束,这与SQL Server的隐式事务模式相似。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值