1008.oracle中事务和锁
锁(lock):为了避免多个用户对同一行进行增删改。(锁太多不好,用户感受不好)
行锁(TX) 表锁(TM)
create table test(id number, name varchar2(100))
(两个进程都在执行)
insert into test values(1,'oracle'); --没有提交
insert into test values(2,'oracle');
产生锁的情况:(当有主键)多个session插入同一个值
解决:快速提交;不让有冲突的机会,插入不同的值。
查看整个数据库中,哪个表的哪些行被锁住了。
select oracle_username username,
session_id sid,
decode(locked_mode,
0,
'None',
1,
'Row share',
3,
'Row Exclusive',
4,
'Share',
5,
'Share Row Exclusicve',
6,
'Exlusive') lock_type,
object_name,
xidusn,
xidslot,
xidsqn
from v$locked_object, dba_objects
where v$locked_object,object_id = dba_objects.object_id;
查看会话号:
select sid from v$mystat where rownum<=1;
session 1
update test set name='mysql' where id=1;
session 2
update test set name='mysql' where id=2;
查看锁产生后,谁把谁给阻塞了:
select * decode(request, 0, 'holder:', 'waiter:')|| sid as sid,
id1,
id2,
lmode,
request,
type,
ctime
from v$lock
where(id1,id2) in (select id1, id2 from v$lock where request > 0)
order by id1, ctime desc;
如何避免锁
select 1 from test where id = 1 for update skip locked;
未选定行表明被锁住了。
表明这一行现在未被锁住
Oracle的锁不消耗资源,因为Oracle的锁是物理上实现的。
orac1e的数据存储在Block(默认8k)里面,被锁直接在块里面标记一下这行被锁了
其他数据库(SQLSERVER,DB2)锁是在内存实现的|并发的dml(insert update delete)
说得更明白点,0racle物理实现的锁,其他数据库内存实现的锁当内存不够,非0racle数据库的行锁就会升级为表锁锁的实现影响高并发DML,这就是为啥商业系统很多用0racle的原因
mysql不能用在大数据()OLTP系统,只能用到电商
Oracle用到 银行、 保险、 证券