内容简介:以上语句修改了三个表,所有产生了在个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(最大值)
(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才能执行成功。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【每日笔记】【Go学习笔记】2019-01-04 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-02 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-07 Codis笔记
- Golang学习笔记-调度器学习
- Vue学习笔记(二)------axios学习
- 算法/NLP/深度学习/机器学习面试笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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++》 这本书的介绍吧!