一、事务特性

事务必须具备以下四个特性,简称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. Flannel网络部署

    一.Flannel网络部署 为Flannel生成证书 [root@linux-node1 ssl]# vim flanneld-csr.json { "CN": "fla ...

  2. 二分图 and code1170 双栈排序

    6.6二分图 二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接. 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶 ...

  3. redis centos 上以 tar.gz 安装redis

    1.下载安装文件#wget http://download.redis.io/releases/redis-3.2.3.tar.gz 2.删除文件 rm -rf /usr/local/redisrm ...

  4. HDU 2044 一只小蜜蜂...(递推,Fibonacci)

    题意:中文题. 析:首先要想到达第 n 个蜂房,那么必须经 第 n-1 或第 n-2 个蜂房,那么从第 n-1 或第 n-2 个蜂房到达第 n 个,都各自有一条路线, 所以答案就是第 n-1 + 第 ...

  5. 深入浅出CSS:Div(一)

    这个系列是学习笔记,简明记录结论性的知识. 新建一个层时,border为零,margin为0,padding为0,如果不指定宽度(width),则自动100%填充父元素. 三.层与父元素的关系 1. ...

  6. Git 客户端基本配置

    Welcome to Git (version -preview20140611) Run 'git help git' to display the help index. Run 'git hel ...

  7. Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏

    胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  8. Spring MVC3.2 通过Servlet3.0实现文件上传

    Servlet3.0规范增加了对文件上传的原生支持,这里记录一下Spring MVC3通过Servlet3上传文件的实现. 配置文件: applicationContext.xml <!-- s ...

  9. mysql初次登陆跳过密码并初始化密码

    如下均已mysql5.7为标准版本. 1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下: #vim /etc/my.cnf(注:windows下修改的是my.ini) 在文档内搜索mys ...

  10. linux查看占用内存多的进程

    update一个简单的方法 ps aux | sort -k4nr | head -10 ps -e  -o "%C  : %p : %z : %a"|sort -k5 -nr|h ...