Oracle TM锁和TX锁

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 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 ID=1

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

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

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

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

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

4、SQL操作为:Create

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

sqlldr批量导入导出数据测试(86天)

sqlldr是在处理大数据量的操作中建议采用的方式,它有许多性能想关的开关,能最大程度的减少redo,undo的生成,控制数据的处理方式(insert,appe...

47490
来自专栏吴伟祥

百万级数据库优化方案 转

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

11720
来自专栏高爽的专栏

Oracle学习记录

       oracle学习过程中记录的一些知识点,包括sqlplus一些命令、角色、DML、DCL、DDL、数据字典、表空间、函数。 1. sys 超级管...

20800
来自专栏乐沙弥的世界

Oracle RAC 环境下的 v$log v$logfile

      通常情况下,在Oracle RAC 环境中,v$视图可查询到你所连接实例的相关信息,而gv$视图则包含所有实例的信息。然而在RAC环境中,当我们查询...

23920
来自专栏农夫安全

注入学习之sqli-labs-3(第二关)

前言 本来是想一个个关卡讲下去,后来自己测试了一下,发现第二、三、四这三关跟第一关,起始原理是一样的,只不过是单引号,双引号,带不带括号的区别,只要我们带入的语...

34760
来自专栏Ryan Miao

mysql创建定时执行存储过程任务

sql语法很多,是一门完整语言。这里仅仅实现一个功能,不做深入研究。 目标:定时更新表或者清空表。 案例:曾经做过定时清空位置信息表的任务。(然而,当时并未考虑...

43270
来自专栏维C果糖

史上最简单的 MySQL 教程(十四)「列属性 之 主键」

主键:primary key,表中主要的键,每张表只能有一个字段(复合主键,可以多个字段)使用此属性,用来唯一的约束该字段里面的数据,不能重复。

455110
来自专栏逸鹏说道

通过MySQL自动同步刷新Redis

在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不...

2K100
来自专栏GreenLeaves

Oracle Schema

1、这是Schema的definition: A schema is a collection of database objects (used by a u...

21060
来自专栏idba

MySQL 5.7 新特性之三

本系列文章基于5.7.20 版本讲述MySQL的新特性,从安装,文件结构,SQL,优化,复制等几个方面展开介绍5.7 的新特性和功能,同时也建议大家跟踪官方bl...

10520

扫码关注云+社区

领取腾讯云代金券