以上语句修改了三个表,所有产生了在个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才能执行成功。