oracle之事务和锁

时间:2022-09-24 09:25:19

Oracle的事务和锁(PPT-I-283-293)

10.1 什么是事务

必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity):  事务是一个完整的操作。事务的各步操作是不可分的(如原子不可分);各步操作要么都执行了,要么都不执行。
一致性(Consistency):1)一个事务结束之后,所有会话发起的查询所看到的该事务的结果都是一致的(commit后的查询有同样的结果)。
                                   2)一个查询的结果必须与数据库在查询开始时的状态保持一致(读不等写,写不等读)。
隔离性(Isolation):  某个会话正在进行的事务所引起的变更对于其他会话来说必须不可见。
持久性(Durability): 事务一旦提交完成后,数据库就不可以丢失这个事务的结果,数据库通过日志能够保持事务的持久性。

10.2 事务的开始和结束

10.2.1 事务采用隐性的方式,起始于session的第一条DML语句,

10.2.2 事务结束于:
1)COMMIT(提交)或ROLLBACK(回滚)
2)DDL语句被执行(提交)
3)DCL语句被执行(提交)
4)用户退出SQLPLUS(正常退出是提交,非正常退出是回滚)
5)服务器故障或系统崩溃(回滚)
6)shutdowm immediate(回滚)

考点:在一个事务里如果某个DML语句失败,之前其他任何DML语句将保持完好,而且不会提交!

10.3 Oracle 的事务保存点功能

savepoint命令允许在事务进行中设置一个标记(保存点),回滚到这个标记可以保留该点之前的事务存在,并使事务继续执行。

实验:
savepoint sp1;
delete from emp1 where empno=7900;
savepoint sp2;
update emp1 set ename='timran' where empno=7788;
select * from emp1;
rollback to sp2;
select * from emp1;
rollback to sp1;

//注意rollback to XXX 后,之前的事务不会结束。

10.4 SCN的概念

SCN全称是System Change Number
它是一个不断增长的整数,相当于Oracle内部的一个时钟,只要数据库一有变更,这个SCN就会增加,Oracle通过SCN记录数据库里事务的一致性。SCN涉及了实例恢复和介质恢复的核心概念,它几乎无处不在:控制文件,数据文件,日志文件都有SCN,包括block上也有SCN。

实际上,我们所说的保证同一时间点一致性读的概念,其背后是物理层面的block读,Oracle会依据你发出select命令,记录下那一刻的SCN值,然后以这个SCN值去同所读的每个block上的SCN比较,如果读到的块上的SCN大于select发出时记录的SCN,则需要利用Undo得到该block的前镜像,在内存中构造CR块(Consistent Read)。

获得当前SCN的两个办法:

SQL> conn / as sysdba
SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    7222678

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 7222708

有两个函数可以实现SCN和TIMESTAMP之间的互转
scn_to_timestamp
timestamp_to_scn

select scn_to_timestamp(current_scn) from v$database;

10.5 共享锁与排他锁的基本原理:

排他锁,排斥其他的排他锁和共享锁。
共享锁,排斥其他的排他锁,但不排斥其他的共享锁。

因为有事务才有锁的概念。Oracle数据库锁可以分为以下几大类:

DML锁(data locks,数据锁),用于保护数据的完整性。
DDL锁(dictionary locks,数据字典锁),用于保护数据库对象的结构,如表、索引等的结构定义。
SYSTEM锁(internal locks and latches),保护数据库的内部结构。

考点:
1)当一个用户对某表做DML操作时,也会加DDL锁,这样在事务未结束前,可防止另一个用户对该表做某些DDL操作。初始化参数ddl_lock_timeout可以设定了DDL锁的等待时间。时间过后如果事务仍未结束,则显示资源正忙。
2)当一个用户对某表做DDL操作时,也会加DML锁(EXCLUSIVE 排他锁),这样可以防止另一个用户对该表做DML操作

我们探讨的是Oracle的DML操作(insert、update、delete),它包括两种锁:TX(DML行锁)和TM(DDL表锁)。

TX 是面向事务的DML行锁,它表示你锁定了表中的一行或若干行。update和delete操作都会产生行锁,insert操作除外。
TM 是面向对象的DDL表锁,它表示你锁定了系统中的一个对象,在锁定期间不允许其他人对这个对象做DDL操作。目的就是为了实施DDL保护。

比如一个update语句,有表级锁(即TM)和行锁(即TX锁)。Oracle是先申请表级锁TM(其中的RX锁), 获得后系统再自动申请行锁(TX), 并将实际锁定的数据行的锁标志置位(即指向该TX锁)。

对于DML操作

行锁(TX)只有一种
表锁(TM)共有五种,分别是 RS,RX,S,SRX,X。

10.6 五种TM表锁的含义:

ROW SHARE 行共享(RS),允许其他用户同时更新其他行,允许其他用户同时加共享锁,不允许有独占(排他性质)的锁
ROW EXCLUSIVE  行排他(RX),允许其他用户同时更新其他行,只允许其他用户同时加行共享锁或者行排他锁
SHARE 共享(S),不允许其他用户同时更新任何行,只允许其他用户同时加共享锁或者行共享锁
SHARE ROW EXCLUSIVE(SRX)  共享行排他,不允许其他用户同时更新其他行,只允许其他用户同时加行共享锁
EXCLUSIVE (X)排他,其他用户禁止更新任何行,禁止其他用户同时加任何排他锁。

sql语句                            加锁模式        许可其他用户的加锁模式
----------------------------------------------------------------------        -------------------------
select * from table_name                    无        RS,RX,S,SRX,X    
insert, update, delete(DML操作)                         RX        RS,RX
select * from table_name for update                RX        RS,RX

----------------------------------------------------------------------        -------------------------

lock table table_name in row share mode            RS        RS,RX,S,SRX
lock table table_name in row exclusive mode        RX        RS,RX
lock table table_name in share mode            S        RS,S
lock table table_name in share row exclusive mode       SRX        RS
lock table table_name in exclusive mode            X        无

10.7 加锁模式

第一种方式:自动加锁

做DML操作时,如insert,update,delete,以及select....for update由oracle自动完成加锁

session1 scott:         //用for update加锁
SQL> select * from dept1 where deptno=30 for update;

DEPTNO DNAME          LOC
---------- -------------- -------------
      30   SALES          CHICAGO

session2 sys: //不试探,被锁住

select * from scott.dept1 for update;

session2 sys: //试探,以防被锁住
SQL>select * from scott.dept1 for update nowait;
SQL>select * from scott.dept1 for update wait 5;

跳过加锁的记录,锁定其他记录
SQL> select * from scott.dept1 for update skip locked;

注意:
1)对整个表for update 是不锁insert语句的。
2)wait 5:等5秒自动退出。nowait:不等待。skip locked:跳过。都可起到防止自己被挂起的作用。

第二种方式:人工方式加锁,用lock命令以显式的方式加锁。

lock table 表名 in exclusive mode.(一般限于后三种表锁)

观察锁的动态视图v$lock
观察锁的静态视图dba_locks

select * from v$lock;
select * from dba_locks where session_id=149;

10.8  死锁和解锁

10.8.1 Oracle自动侦测死锁,自动解决锁争用。

制作死锁案例:

scott:

SQL> select * from a;

ID_A
----------
         1
         2

brain:

SQL> select * from b;

ID_B
----------
       100
       200

ORA-00060: deadlock detected while waiting for resource

scott:   //改自己,不提交

update table a set id=11 where id=1;
brain:   //改自己,不提交
update table b set id=1100 where id=100;
scott:   //改对方,被锁住
update table brain.b id=1000 where id=100;
brain:   //改对方,造成死锁
update table brain.b id=1000 where id=100;

10.8.2 管理员如何解鎖

可以根据以下方法准确定位要kill session的sid号和serial#号,

SQL> select * from v$lock where type in ('TX','TM');
 
ADDR     KADDR           SID         TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
38B66D60 38B66D8C        127     TX       327680       1042          0          6           2985          1
00567BAC 00567BDC        134     TM        71090          0              3          0          2996          0
00567BAC 00567BDC        127     TM        71090          0             3          0           2985          0
37960894 379608D4        134     TX       327680       1042          6          0           2996          0

SQL> select a.sid,a.serial#,b.sql_text from v$session a,v$sql b where a.prev_sql_id=b.sql_id and a.sid=127;
 
       SID    SERIAL# SQL_TEXT
---------- ---------- --------------------------------------------------------------------------------
       127       2449 update emp1 set sal=8000 where empno=7788
 
SQL> select sid,serial#,blocking_session,username,event from v$session where blocking_session_status='VALID';
 
       SID    SERIAL# BLOCKING_SESSION USERNAME                       EVENT
---------- ---------- ---------------- ------------------------------ ----------------------------------------
       127       2449              134     SCOTT                          enq: TX - row lock contention
 
 
也可以根据v$lock视图的block 和request确定session阻塞关系,确定无误后再杀掉这个session

SQL>ALTER SYSTEM KILL SESSION '127,2449'; 

更详细的信息,可以从多个视图得出,相关的视图有:v$session,v$process,v$sql,v$locked,v$sqlarea等等

阻塞(排队)从EM里看的更清楚 EM-->Performance-->Additional Monitoring Links-->Blocking Sessions(或Instance Locks)

oracle之事务和锁的更多相关文章

  1. Oracle事务与锁 知识点摘记

    事务:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功要么全部失败. 说明:一组SQL,一个逻辑工作单位,执行整体修改或者整体回退. 事务的相关概念: 1.事务的提 ...

  2. Oracle事务与锁

    Oracle事务与锁 2017-12-13 目录 1 数据库事务概括  1.1 事务定义  1.2 事务生命周期  1.3 事物的特性  1.4 死锁2 事务相关语句  2.1 事务相关语句概括  2 ...

  3. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  4. 数据库事务隔离级ORACLE数据库事务隔离级别介绍

    本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...

  5. Oracle的学习三:java连接Oracle、事务、内置函数、日期函数、转换函数、系统函数

    1.java程序操作Oracle java连接Oracle JDBC_ODBC桥连接 1.加载驱动: Class.forName("sun.jdbc.odbc.JdbcodbcDriver& ...

  6. Oracle之事务

    一,oracle的事务: 是指对数据操作的一系列动作的统称.即:事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的. 事务有四大特性(ACID): 1,原子性(a ...

  7. 浅述Oracle分布式事务概念

    着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...

  8. MySQL事务与锁

    MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...

  9. pl/sql学习(5): 触发器trigger/事务和锁

    (一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...

随机推荐

  1. PHP 数据库操作类:ezSQL

    EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.htmlezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.o ...

  2. MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  3. linux .net mono方案测试记录与报告(一)

    第一阶段 linux .net 方案测试 硬件为4核8线程的笔记本i7-4710mq 分配了4个线程 情况下 1.方案一 nginx+fastcgi-mono-server4方式 性能为每秒处理140 ...

  4. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

  5. ruby轻松自删除代码

    因为windows的文件删除机制和unix like的不一样,so不保证如下代码能在windows中使用,哪位童鞋帮我在windows中测试一下也好啊! #!/usr/bin/ruby 5.times ...

  6. python精进之路1---基础数据类型

    python精进之路1---基本数据类型 python的基本数据类型如上图,重点需要掌握字符串.列表和字典. 一.int.float类型 int主要是用于整数类型计算,float主要用于小数. int ...

  7. [转]Docker和Rancher的安装与基本使用

    本文转自:https://blog.csdn.net/wangshouhan/article/details/80405672 一.Docker1.CentOS下Docker安装 安装 $ yum - ...

  8. 『TensorFlow』张量尺寸获取

    tf.shape(a)和a.get_shape()比较 相同点:都可以得到tensor a的尺寸 不同点:tf.shape()中a 数据的类型可以是tensor, list, array a.get_ ...

  9. 软工作业No.7 甜美女孩第五周--测试与发布

    Alpha版本发布说明 一.功能介绍 本团队所做的多模式自定义2048是用来进行纸牌模式以及正常基础模式版本的2048小游戏的.Alpha版本具有的功能大体如下: 初始界面- 纸牌模式- 基础模式- ...

  10. node.js中使用socket.io + express进行实时消息推送

    socket.io是一个websocket库,包含客户端的js和服务端的node.js,可以在不同浏览器和移动设备上构建实时应用. 一.安装 socket.io npm install socket. ...