加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle锁

发布时间:2020-12-12 16:07:12 所属栏目:百科 来源:网络整理
导读:一、ANSI/ISO事务的隔离级别指的是,一个事务对数据库的修改与另外一个事务的隔离程度 1.两个并发事务T1和T2在访问相同的行,可能存在的三种问题 a.幻像读取---T1通过where条件进行查询返回的行,T2插入了新的纪录,正好满足T1的where的条件,这时T1再次查询
一、ANSI/ISO事务的隔离级别指的是,一个事务对数据库的修改与另外一个事务的隔离程度 1.两个并发事务T1和T2在访问相同的行,可能存在的三种问题 a.幻像读取---T1通过where条件进行查询返回的行,T2插入了新的纪录,正好满足T1的where的条件,这时T1再次查询 看到了T2新插入的值,对于T1来说就像变魔术一样 b.不可重复读取---T1读取了1行,这时T2修改了T1读取的纪录,当T1再次读取的时候发现数据不一样了,这个称为 不可重复读 c.脏读---T1更新了1条纪录的内容但是并没有进行提交,T2读取更新后的行,然后T1执行了回滚,T2所读取的行就无效了 2.为了处理上述问题,sql标准定义了几种事务隔离级别,按照隔离性级别从低到高依次为 a. READ UNCOMMITTED :幻像读、不可重复读和脏读都允许 b. READ COMMITTED :允许幻像读和不可重复读,但是不允许脏读 c. REPEATABLE READ :允许幻像读,但是不允许不可重复读和脏读 d. SERIALIZABLE :幻像读、不可重复读和脏读都不允许 二、oracle支持READ COMMITTED和SERIALIZABLE两种事务的隔离级别,不支持其他2种,oracle默认的隔离级别是READ COMMITTED,这里其实由于undo的作用不会出现脏读 三、事务的隔离级别可以使用 set transaction 语句设置 set transaction isolation level serializable; 四、锁模式 1.排他锁:简记为X锁,T1对数据对象A加上X锁,则只允许T1读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T1释放A上的锁。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁 2.共享锁:共享锁又称为读锁(Share lock,简记为S锁),若事务T1对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T1释放A上的S锁。 五、oracle锁分类 分为三大类 1.dml锁,主要是保护数据,主要有表锁和行锁,防止并发的ddl和dml操作导致的破坏 分为2类 a.Row lock(TX) 行上的锁,insert、update、delete、merge、select ... for update,和别的数据库需要单独的在内存中存在一个锁列表不同,oracle是通过在数据块 头部包含行锁的信息的 V$TRANSACTION视图列出了活动的事务 b.Table locks(TM) 表上的锁,insert、update、delete、merge、select ... for update,lock table语句 这里又分为几类 i.Row Share (RS):行共享锁 也叫做subshare table lock (SS),表示事务在表上的锁主要是锁定表中的行,行共享锁是表锁中最不受限制 的模式,为表提供了最高的并发度 ii.Row Exclusive Table Lock (RX) 也叫做subexclusive table lock (SX),一般指的是更新表行的时候持有的锁或者select for update语句,它允许其他事务 select,insert,update,delete或同时在同一个表上进行行锁,因此sx允许多个事务获取同一个表的SX和subshare表锁 iii.Share Table Lock (S) 一个表级共享锁,允许其他事务select(不是select ... for update),但是只有当前保持共享锁的事务才可以修改内容,又因为可以多个事务 都在表上加共享锁,因此保持此锁不一定可以修改对应的内容 iv.Share Row Exclusive Table Lock (SRX) 也可以叫做share-subexclusive table lock (SSX),它比S锁更严格,同一时刻只能有一个事务请求到ssx锁,请到到共享锁后,允许其他事务进行查询,但是不可以进行 更新 v.Exclusive Table Lock (X) 这个是最严格的锁,它禁止其他事务执行任何类型的dml语句或放置任何类型的表锁 2.ddl锁,主要是保护对象的结构,这里的ddl是data dictionary (DDL) lock,不是Data Definition Language, 从字面上看这个是数据字典锁,就是对数据对象进行加锁保护,ddl锁是oracle自动控制的,用户无法进行显示请求 比如用户创建一个存储过程,oracle会自动在存储过程中定义的对象上加锁,主要是阻止在程序编译过程中这些对象被修改或删除 a.Exclusive DDL Locks b.Share DDL Locks c.Breakable Parse Locks 3.system锁,主要是保护内部数据结构 六、查看锁类型 1.我们执行下面的语句 SQL> select * from dept for update; --查看这个会加什么锁 SQL> select se.USERNAME,lo.type,decode(lo.lmode,'none',1,'null',2,'row-s(ss)',3,'row-x(sx)',4,'share',5,'s/row-x(ssx)',6,'exclusive',to_char(lo.lmode)) lmode from v$lock lo,v$session se where lo.sid=se.sid 2 and se.username='SCOTT'; USERNAME TY LMODE ------------------------------ -- ---------------------------------------- SCOTT TX exclusive SCOTT AE share SCOTT TM row-x(sx) --提一条TX表示的是事务锁也就是行锁,exclusive是排他锁,也就是行上的排他锁 --第二条AE表示的是编辑锁,share表示的时共享锁,也就是编辑共享锁 --第三条TM表示的是dml锁或对象锁也就是表锁,row-x(sx)表示的时行排他锁 这里可以通过v$lock_type来查看 其实在行上加的锁也就会自动升级到表上,一个事务如果在行上加了一个锁的话,那么这个事务也会请求在表上 增加这个行锁,因此tm类型的锁区分为行和表,这里也就是为什么insert、update、delete、merge、select ... for update 即会造成tx锁也会造成tm锁

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读