Oracle-OCP学习笔记:锁 latch,lock(下)

以上语句修改了三个表,所有产生了在个TM锁,但只产生一个TX锁。

 

可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定

select name, value from v$parameter where name in('transactions','dml_locks');

NAME          VALUE 

dml_locks      1088  #一个数据库可能同时有1088个锁存在

transactions    272  #一个数据库同时有272个事务可以运行

 

以上的参数可以修改,系统有一个参考值,来评价配置的参数是否有问题:

select resource_name as "R_N",current_utilization as "C_U",max_utilization as "M_U",initial_allocation as"I_U" 

from v$resource_limit 

whereresource_name in('transactions','dml_locks');

R_N              C_U(当前值)     M_U(历史最大值)    I_U(最大值)

dml_locks        3                    3                 1088

transactions     1                    1               272

原则:M_U(历史最大值) <= I_U(最大值)

 

7、死锁 (1.SQL语句的问题,2.oracle会自动杀死占用资源少的锁)
两 个session(以A和C来表示),如果A持有C正在申请的锁定,同时C也持有A正在申请的锁定时,这时发生死锁现象。死锁是典型的“双输”情况,如果 任其发展,则会出现A和C这两个session正在执行的事务都无法结束的现象。因此,在Oracle数据库中,造成死锁的那个DML语句会被撤销。死锁 总是由于应用程序设计不合理引起的。
当某个session的事务引起了死锁时,Oracle会自动将阻塞该事务的其他事务中相应的DML语句撤销,而阻塞该事务的其他事务中的其他DML语句并没有撤销。
session 1

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||'a' where employee_id=100 ;

session 2

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||'b' where employee_id=101;

session 1

update employees set last_name=last_name||'c' where employee_id=101;

session 2

update employees set last_name=last_name||'d' where employee_id=100;

演示:

会话A:

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||'a' where employee_id=100 ;

       SID

----------

     9

Elapsed: 00:00:00.03

HR @ORCL>

1 row updated.

Elapsed: 00:00:00.02

HR @ORCL>update employees set last_name=last_name||'c' whereemployee_id=101;

update employees set last_name=last_name||'c' where employee_id=101

       *

ERROR at line 1:

ORA-00060: 等待资源时检测到死锁

Elapsed: 00:00:11.12

 

会话B:

HR @ORCL>

select sid from v$mystat where rownum=1;

       SID

----------

    20

update employees set last_name=last_name||'b' where employee_id=101;

Elapsed: 00:00:00.03

HR @ORCL>

1 row updated.

Elapsed: 00:00:00.04

HR @ORCL>

HR @ORCL>update employees set last_name=last_name||'d' where employee_id=100;

 

分析:A事务锁定id=100,B事务锁定id=101

这时A事务再次锁定id=101,B事务再次锁定100,这时产生了死锁。

ORACLE会自动判断死锁,并立刻回滚了A事务,但这时B事务还在等待事务A id=100的提交,当事务A id=100提交后,事务B执行的id=100才能执行成功。


分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS