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 ('', '张三', 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 ('', '李四', null, '', '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 ('', '王五', 20, '', '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 ('', '赵六', 23, '', '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 ('', '冯七', 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
Oracle TM锁和TX锁的更多相关文章
-
理解Oracle TM和TX锁
在Oracle中有很多锁,通过v$lock_type视图可以查看Oracle中所有类型的锁,在本篇文章中我们熟悉一下TM和TX锁的类型 SQL> select * from v$lock_typ ...
-
ORACLE【2】:锁机制及解锁
1. 锁的基本知识 根据要保护的对象不同,oracle的数据锁可以分成以下几类:DML锁,(data locks)数据锁,用于保护数据的完整性:DDL锁(dictionary locks),用于保护数 ...
-
Oracle关于TX锁的一个有趣的问题
前阵子有一个网友在群里问了一个关于Oracle数据库的TX锁问题,问题原文如下: 请教一个问题: 两个会话执行不同的delete语句,结果都是删除同一个行.先执行的会话里where条件不加索引走全表扫 ...
-
Oracle 6 - 锁和闩 - 锁类型
Oracle锁大类 1.DML锁 (SELECT, INSERT, UPDATE, DELETE, MERGE是对数据库加的锁, 可能是行锁,也可能是表锁) 2.DDL锁 (Create, Alter ...
-
通过Oracle补充日志,找到锁阻塞源头的SQL
问题背景: 有时会考虑一件事情,如果在Oracle环境下出现了锁阻塞的情况,如何定位到SQL源头(通过session.lock.transaction等视图仅能定位到会话)?或许有人会想有没有可能通过 ...
-
Oracle-查看oracle是否有表被锁
问题现象: 查看oracle是否有表被锁 解决方法: select sid,serial#,program,terminal,username,b.object_id,c.object_name f ...
-
Oracle数据库悲观锁与乐观锁详解
数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.而乐 ...
-
TX锁处理
实际处理后,在测试环境中模拟还原TX锁,及处理. 本篇博客目录: 1.TX锁模拟实际环境 2.登陆数据库,查询相关信息 3.确认锁源头,kill进程释放资源 一.TX锁模拟 sess_1 SQL> ...
-
Oracle的悲观锁和乐观锁
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定. 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫 ...
随机推荐
-
StringBuilder 拼接sql语句比较快
StringBuilder 拼接sql语句比较快StringBuilder strBuilder = new StringBuilder();strSql += "insert into t ...
-
zookeeper适用场景:如何竞选Master及代码实现
问题导读:1.如何利用zookeeper保证集群Master可用性和唯一性?2.zookeeper竞选Master包含哪些过程?3.zookeeper竞选Master机制利用了zk哪些特性? 在zoo ...
-
201521123081《Java程序设计》 第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 参考资料:百度脑图(上图为第3周实验学习总结中未展开部分) 1.2 使用常规方法总结其他上课内容. 多态.思维导图中有提及. 2. ...
-
mysql 分库分表备份脚本
#!/bin/bash USER=root #用户 PASSWORD=123456 #密码 MYSQL_PATH=127.0.0.1 #地址 MYSQL_BIN=/bin/mysql MYSQL_DU ...
-
MySql数据库学习笔记(2)
DELETE 语法:delete from 表名 [where condition] delete from grade; TRUNCATE 用于完全清空表数据,但表结构.索引.约束不变: 语法: t ...
-
构建自己的 Smart Life 私有云(一)->; 破解涂鸦智能插座
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...
-
visual studio Web发布至 IIS WebDeploy出错(未能创建SSL/TLS安全通道)Could not create SSL/TLS secure channel
问题发生的原因是VS 15.9尝试使用系统默认值进行TLS握手,但是要在VS内的某处设置为TLS1.2. 此问题的解决方法是在部署项目的IIS服务器上启用TLS 1.2.例如,请按照此文章中的说明操作
-
Windows开机BIOS启动快捷按键
Window装系统,开机需要调整启动选项...不同的机型,进入BIOS按键不同 按键列表
-
Watermelon -- codeforces
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93241#problem/A (654123) http://codeforces.co ...
-
Linux操作系统(三)
文件系统: boot sector:记录引导文件 sb: super block 每个文件系统只有一个sb,其余black group均是它的备份 读写文件会进入到inode operation vf ...