博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle TM锁和TX锁
阅读量:7281 次
发布时间:2019-06-30

本文共 2159 字,大约阅读时间需要 7 分钟。

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)

  排它锁

  Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

 

 

1、SQL操作为:Select

当多用户进行Select 操作时,oracle不会进行任何加锁的,也就意味这,当有其他的用户在访问或者修改当前Select正在操作的结果集中的一行或多行数据时,是不会有任何影响的,Oracle会返回当前时刻的结果集。所以Select操作,不会进行任何加锁操作。

 

2、SQL操作为:Select for update

请参考,使用了select for update会给结果集加上一个行级共享锁,其他的会话只能进行查询操作(上面说了Select操作,不会对数据集进行加锁)。

 

3、SQL操作为:Insert、Update、Delete

oracle在当前操作Commit之前会给相关数据行加上行级排它锁,其他会话不能对当前数据行进行DML操作,代码如下:

新建SQL窗口(相当于新建一个会话),执行以下代码:

update test6 set NAME='zc' where ID=1

此时,不执行Commot操作,那么当前行(ID=1的数据行)将被加锁

接着新建一个SQL窗口(相当于新建一个会话),执行以下代码:

update test6 set NAME='zc1' where ID=1

结果显示,会话二因为会话一对ID=1的数据行进行了加锁,所以会话二会一直等待,知道会话一释放锁;

这里,Insert和Delete就不做实例代码了,过程差不多,可以自行验证。

 

4、SQL操作为:Create

 

转载地址:http://ockjm.baihongyu.com/

你可能感兴趣的文章
内核中的同步与互斥
查看>>
linux下安装SVN和MAVEN,并依赖MAVEN环境打包MAVEN项目
查看>>
mysql的备份和恢复
查看>>
Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
查看>>
iOS自动检测版本更新
查看>>
nginx-1.6.3
查看>>
验证逻辑
查看>>
DDoS deflate - Linux防御和减轻DDos***工具
查看>>
Http服务压力测试工具Alex(自带Web UI)
查看>>
linux(Centos7) elasticsearch 伪集群搭建
查看>>
服务器出现 server kernel: ip_conntrack: table full, dropping packet. 问题
查看>>
2016年度总结
查看>>
Red Hat 下LAMP环境——MyDNS安装实例
查看>>
windows server 2016 系统管理(二)
查看>>
Go Web基础视频教程
查看>>
用SQL语句,删除掉重复项只保留一条
查看>>
hibernate4与spring3的整合,不兼容
查看>>
我的友情链接
查看>>
Linux下的hosts文件和network文件区别
查看>>
vim脚本编程
查看>>