Oracle并发控制、事务管理学习笔记(三)

2014-11-24 02:40:13 · 作者: · 浏览: 17
ID') 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语句来查询阻塞的会话。

  1. name="code">SQL> SET LINESIZE 120;  
  2. SQL> COLUMN BLOCKERS FORMAT A20;
  3. SQL> COLUMN WAITERS FORMAT A50;
  4. SQL> SELECT SB.SID||':'||SB.SERIAL#||' '||SB.USERNAME BLOCKERS,
  5. 2 SW.SID||':'||SW.SERIAL#||' '||SW.USERNAME||' '||SQLW.SQL_TEXT WAITERS
  6. 3 FROM V$LOCK LB, V$LOCK LW, V$SESSION SB, V$SESSION SW, V$SQLAREA SQLW
  7. 4 WHERE LB.ID1=LW.ID1
  8. 5 AND LB.BLOCK=1
  9. 6 AND LW.BLOCK=0
  10. 7 AND LB.SID=SB.SID
  11. 8 AND LW.SID=SW.SID
  12. 9 AND SW.SQL_ID=SQLW.SQL_ID;
  13. BLOCKERS WAITERS
  14. -------------------- --------------------------------------------------
  15. 170:6 HR 155:14 HR UPDATE T2 SET COL='B' WHERE COL='A'
  16. SQL>

 
 

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

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

原文:http://www.examda.com/oracle/zonghe/20101008/103744390.html

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

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

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

  一.事务的概念

  事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。事务的一个典型例子是银 行中的转帐操作,帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个