设为首页 收藏本站
查看: 1000|回复: 0

[经验分享] Oracle TM锁和TX锁

[复制链接]

尚未签到

发表于 2017-12-10 16:36:34 | 显示全部楼层 |阅读模式
  

CREATE TABLE "TEST6"  
(   
  "ID"
VARCHAR2(30),  "NAME"
VARCHAR2(30),  "AGE"
NUMBER(2,0),  "SEX"
VARCHAR2(2),  "ENAME"
VARCHAR2(30),  "ADDTIME" DATE
  
)
  

insert into TEST6 (id, name, age, sex, ename, addtime) values ('1', '张三', 18, null, 'zhangsan', to_date('14-03-2017 00:00:09', 'dd-mm-yyyy hh24:mi:ss'));  

insert into TEST6 (id, name, age, sex, ename, addtime) values ('2', '李四', null, '1', 'Lisi', to_date('01-03-2017 02:00:00', 'dd-mm-yyyy hh24:mi:ss'));  

insert into TEST6 (id, name, age, sex, ename, addtime) values ('3', '王五', 20, '0', 'wangwu', to_date('09-01-2017 08:55:00', 'dd-mm-yyyy hh24:mi:ss'));  

insert into TEST6 (id, name, age, sex, ename, addtime) values ('4', '赵六', 23, '0', 'zhaoliu', to_date('03-03-2016 04:00:00', 'dd-mm-yyyy hh24:mi:ss'));  

insert into TEST6 (id, name, age, sex, ename, addtime) values ('5', '冯七', 22, null, 'fengqi', to_date('08-03-2017 12:00:01', 'dd-mm-yyyy hh24:mi:ss'));  

  本文主要介绍Oracle中的TM锁,了解当我们通过sql语句访问数据库中的同一表对象时,此时如果多个用户对同一表对象进行操作的话,可能会产生数据不一致,关于数据不一致,请参考数据库事务的一致性和原子性浅析,oracle解决事务在多线程情况下的数据不一致问题,主要是通过两种锁,一种是悲观锁,也就是我接下来要说的,另一种是乐观锁,关于这两种锁的介绍同样也请参考数据库事务的一致性和原子性浅析。
  TM锁和TX锁就是悲观锁的一部分,那么oracle是怎么通过TM锁TX锁来解决多用户访问同一对象,保证数据一致的问题的。
  下面通过表格和文字来介绍所有的oracle TM锁

表1 Oracle的TM锁类型


锁模式


  锁描述


  解释


SQL操作


0


  none



1


  NULL


  空


  Select


2


  SS(Row-S)


  行级共享锁,其他对象只能查询这些数据行


  Select for update、Lock for update、Lock row share


3


  SX(Row-X)


  行级排它锁,在提交前不允许做DML操作


  Insert、Update、Delete、Lock row share


4


  S(Share)


  共享锁


  Create index、Lock share


5


  SSX(S/Row-X)


  共享行级排它锁


  Lock share row exclusive


6


  X(Exclusive)


  排它锁



>  1、SQL操作为:Select
  当多用户进行Select 操作时,oracle不会进行任何加锁的,也就意味这,当有其他的用户在访问或者修改当前Select正在操作的结果集中的一行或多行数据时,是不会有任何影响的,Oracle会返回当前时刻的结果集。所以Select操作,不会进行任何加锁操作。
  2、SQL操作为:Select for update
  请参考select for update和select for update wait和select for update nowait的区别,使用了select for update会给结果集加上一个行级共享锁,其他的会话只能进行查询操作(上面说了Select操作,不会对数据集进行加锁)。
  3、SQL操作为:Insert、Update、Delete
  oracle在当前操作Commit之前会给相关数据行加上行级排它锁,其他会话不能对当前数据行进行DML操作,代码如下:
  新建SQL窗口(相当于新建一个会话),执行以下代码:
  

update test6 set NAME='zc' where>  

  此时,不执行Commot操作,那么当前行(ID=1的数据行)将被加锁
  接着新建一个SQL窗口(相当于新建一个会话),执行以下代码:
  

update test6 set NAME='zc1' where>  

DSC0000.png

  结果显示,会话二因为会话一对ID=1的数据行进行了加锁,所以会话二会一直等待,知道会话一释放锁;
  这里,Insert和Delete就不做实例代码了,过程差不多,可以自行验证。
  4、SQL操作为:Create

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422711-1-1.html 上篇帖子: Oracle 12c 多租户 CDB 与 PDB 备份 下篇帖子: Oracle数据库中几种常见的SCN
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表