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;
0
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;
0
未选定行表明被锁住了。
0
表明这一行现在未被锁住
Oracle的锁不消耗资源,因为Oracle的锁是物理上实现的。
orac1e的数据存储在Block(默认8k)里面,被锁直接在块里面标记一下这行被锁了
其他数据库(SQLSERVER,DB2)锁是在内存实现的|并发的dml(insert update delete)
说得更明白点,0racle物理实现的锁,其他数据库内存实现的锁当内存不够,非0racle数据库的行锁就会升级为表锁锁的实现影响高并发DML,这就是为啥商业系统很多用0racle的原因
mysql不能用在大数据()OLTP系统,只能用到电商
Oracle用到 银行、 保险、 证券 
posted @ 2021-01-12 00:06  bufuzhou  阅读(76)  评论(0编辑  收藏  举报