一、事务特性

事务必须具备以下四个特性,简称ACID属性

  1. 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分割的(原子的);要么都执行,要么都不执行
    场景:银行转账 A-100 B+100,同时成功或失败。
  2. 一致性(Consistency):一个查询的结果必须与数据库在查询开始的状态一致(读不等待写,写不等待读。)
    场景:下午1点查询数据,1点半查出结果,这期间有人更新了数据,那么1点半查出来的数据不会是更新后的数据,会把undo里的相关数据返回
  3. 隔离性(isolation):对于其他对话来说,未提交的事务必须不可见。
    场景:A和B在各自的session中做任何操作,只要没有提交,相互之间没有任何影响。
  4. 持久性(Durability):事务一单提交完成,数据库不会丢失这个事务的结果,数据库通过日志能够保持事务的持久性。
    场景:事务提交后不可逆,提交数据是有内存的数据刷新到磁盘上,这个过程快慢和性能有关。那么oracle主要是靠rudo日志,先记录到日志,再写到磁盘上。

二、事务的开始和结束

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

查看事务:select * from v$transaction;

事务结束于提交或者回滚:

  1. commit或者rollback
  2. ddl语句被执行
  3. dcl语句被执行
  4. 用户退出sqlplus(提交【正常退出】或者回滚)
  5. 机器故障(回滚)
  6. shutdown immediate(回滚)

三、锁

锁分为共享锁和排他锁

排他锁(独占),排斥其他的排他锁和共享锁。

共享锁:排斥其他排他锁,但不排斥其他共享锁。

锁类型:

  DML锁(data locks,数据 锁),用于保护数据的完整性,TX(行级锁),TM(表级锁),日常使用的DML操作就会产生事务和锁。

  查看事务:select * from v$transaction;

  查看锁:select * from v$lock

  DDL锁(dictionary locks,数据字典锁):用户保护数据库对象的结构,如表、索引等结构定义。

  SYSTEM锁(internal locks and latches):保护数据库的内部结构

用途:只有事务才会产生锁,保证数据完整性和正确性。

四、加锁的模式

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

  select * from emp where deptno=10 for update;

部门为10 的记录会被锁定,我们可以进行试探要修改的数据是否被加锁:

  • select * from emp where empno=7782 for update nowait;
  • select * from emp where empno=7782 for update wait 5;
  • select * from emp where job='CLERK' for update skip locked;

如果这个锁占用的时间很长,我们可以通过管理员kill掉session用户。

  1. 首先在v$lock表中查看是哪个id占用了太长时间
  2. 根据v$lock的¥id,去v$session里找到,进行kill
    select sid,serial# from v$session where sid=170
    alter system kill session 'sid,serial'

下图使用for update 数据被锁住(注意标注的地方):

另一个客户端再执行update,就会之一在等待状态,直到前一个客户端的update提交才停止等待:

要是不想等待就用 nowait,如果数据被锁定会给报错:

解锁:

select * from v$lock;

不难发现sid为9的session的type为TM和TX,所以把sid为9的session在v$session中对应的记录kill

select sid,serial# from v$session where sid=9

alter system kill session '9,627';

这时候sid为9的session想提交的话会报错:

死锁问题:

oracle会自动解决死锁,如

A用户:update a set id = 1000 where id=100;

B用户:update a set id = 2000 where id=200;

这两条记录都还没有提交,接着A用户又想修改id=200的记录,同时B用户想修改id=100的记录:

A用户:update a set id = 20 where id=200;

B用户:update a set id= 10 where id=100;

这样会造成死锁,这时oracle会自动检测到死锁并解决死锁。要注意执行的顺序才能看到效果。

40.oracle事务的更多相关文章

  1. Oracle事务

    Oracle事务的ACID特性 原子性Atomicity:事务中的所有动作要么都发生,要么都不发生. 一致性Consistency:事务将数据库从一种状态转变为下一种一致状态. 隔离性Isolatio ...

  2. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  3. Oracle事务之一:锁和隔离

    Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...

  4. oracle事务和锁

    数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数 ...

  5. oracle事务和锁(转)

    If you use a SET TRANSACTION statement, then it must be the first statement in your transaction. How ...

  6. oracle事务(转)

    今天温习oracle事务,记录如下: 事务定义            事务是保持数据的一致性,它由相关的DDL或者DML语句做为载体,这组语句执行的结果要么一起成功,要么一起失败.        我们 ...

  7. oracle 事务 与 提交

    Oracle事务 一般事务(DML)即数据修改(增.删.改)的事务事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作.当事务被提交或回滚后,这些数据才会被 ...

  8. Oracle事务隔离级别处理差异

    Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZAB ...

  9. Oracle事务与锁

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

随机推荐

  1. MVC页面和表单

    @Styles.Render("~/Content/css")//在head中引用css @Scripts.Render("~/bundles/modernizr&quo ...

  2. IntelliJ IDEA 2017版 SpringBoot的Json字符串返回

    一.说明 SpringBoot框架已经自动封装好json字符串解析,所以我们只需要用它的注解来返回操作就可以了. 二.实战 1.书写一个实体类User,设置属性id和name package com. ...

  3. Linux umask权限

    文件基本权限 Linux中文件权限由三部分组成: rw-r--r-- 前三位:表示用户所拥有的权限 中三位:表示用户所在组的权限 后三们:表示其他用户的权限 权限 八进制 十进制 - - - 000 ...

  4. 监控小工具(jconsole)

    偶然发现的一个监控小工具 配置好Jmeter运行的环境,在CMD命令中输入:jconsole 即可弹出一个[java监视和管理控制台]

  5. 关于SQLServer无法对数据库'XXX'执行删除,因为它正用于复制。错误:'3724' 的解决方案

    关于这个错误,是因为在服务器上想把数据库复制到本地,使用了“发布.订阅”方案,结果后来没成功,删除本地数据库的时候出现了这个错误,说“无法对数据库'XXX'执行删除,因为它正用于复制”. 解决方案:只 ...

  6. struts2+websocket报错:failed: Error during WebSocket handshake: Unexpected response code:404

    最近把websocket集成进项目里面来,打开网页总是会遇到这样的错误. 网上说的原因有3种,但是都不适合我,但是也记录下. 1.struts2截拦掉了ws的请求.这种援用可以尝试把web.xml清空 ...

  7. Oracle EBS Add Responsibility to User by the Responsibility reference of Other User.

    Oracle EBS 11i Add Responsibility to User by the Responsibility reference of Other User. Warning: R1 ...

  8. SqlServer获取字符串中数字,中文及字符部分数据

    --获取英文字符数据 Create function [dbo].[Fun_GetChar] ( ) ) ) AS BEGIN BEGIN ,'') --删掉一个非数字的字符,循环结束,剩余的为数字部 ...

  9. 深夜配置一把struts2

    在intellij idea里面配置出来了struts2的一个Helloworld,因为换了工具,在网上查了很多关于IDEA配置它的方式,好多是用Maven解决依赖关系的.于是按照网上的来,发现很多东 ...

  10. Solr相似度算法三:DRFSimilarity

    该Similarity 实现了  divergence from randomness (偏离随机性)框架,这是一种基于同名概率模型的相似度模型. 该 similarity有以下配置选项: basic ...