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

栏目: 数据库 · 发布时间: 7年前

内容简介:以上语句修改了三个表,所有产生了在个TM锁,但只产生一个TX锁。可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定

以上语句修改了三个表,所有产生了在个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 

where resource_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才能执行成功。

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Linear Optimization

Introduction to Linear Optimization

Dimitris Bertsimas、John N. Tsitsiklis / Athena Scientific / 1997-02-01 / USD 89.00

"The true merit of this book, however, lies in its pedagogical qualities which are so impressive..." "Throughout the book, the authors make serious efforts to give geometric and intuitive explanations......一起来看看 《Introduction to Linear Optimization》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具