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

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

内容简介:以上语句修改了三个表,所有产生了在个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(下)


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

查看所有标签

猜你喜欢:

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

Algorithms in C++

Algorithms in C++

Robert Sedgewick / Addison-Wesley Professional / 1992-05-10 / USD 64.99

This version of Sedgewick's bestselling book provides a comprehensive collection of algorithms implemented in C++. The algorithms included cover a broad range of fundamental and more advanced methods:......一起来看看 《Algorithms in C++》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具