Oracle - 数据更新 - 事务

/*
    事务
        事务是为了控制数据异步访问所使用的一种技术
        就类似于java中的锁机制 synchronized,只不过功能更加强大
        事务不能进行嵌套,当我们开启一个事务的之后作的每一次dml语句都属于这个事务

        在oracle里面
            事务的开启
                执行一个dml语句就会开启一个事务
                他会把当前dml语句操作的数据进行锁定,别人在操作这些数据的时候就需要等锁
            事务的结束
                当事务结束的时候会释放掉当前事务所拥有的锁

                显示的事务结束
                    rollback:事务的回滚
                        回到开启事务的之前的状态
                    commit:事务的提交
                        将数据写入到数据库
                隐式的事务结束
                    执行DDL(创建表)语句会提交当前事务
                    正常退出数据库会提交事务
                    非正常退出会回滚事务

    制造oracle数据库的死锁
        窗口1
            UPDATE EMP SET SAL = 888 WHERE EMPNO = 7788;
        窗口2
            UPDATE EMP SET SAL = 666 WHERE EMPNO = 7934;
        窗口1
            UPDATE EMP SET SAL = 666 WHERE EMPNO = 7934;
        窗口2
            UPDATE EMP SET SAL = 888 WHERE EMPNO = 7788;

        ORACLE死锁是非常影响性能的,所以有自己的死锁检测机制

    Oracle查询也会开启事务
        SELECT * FROM EMP FOR UPDATE;

    事务的隔离级别
        定义
            在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

        更新丢失
            两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了
            两个事务同时操作一条数据,如果没有锁,那么我正在更改的数据可能会覆盖别人的数据
        脏读
            一个事务读取到了另一个事务未提交的数据操作结果
            如果A线程更新数据为888,然后锁定,如果这个时候b线程可以看到这个数据
        不可重复读
            一个事务对同一行数据重复读取两次,但是却得到了不同的结果
            虚读
                别的事务对其做了修改操作
            幻读
                别的事务对其做了 新增 删除 操作

        SQL定义了一些级别去避免这些问题
            未授权读取,也称为读未提交(Read Uncommitted)
                可以避免更新丢失,但是不能避免脏读
            授权读取,也称为读提交(Read Committed)
                可以避免脏读,但是不能避免  不可重复读
            可重复读取(Repeatable Read)
                避免了脏读和虚读和幻读的删除操作
                但是不能避免幻读的新增操作
            序列化      序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行
    事务的四大特征
            原子性( Atomicity )、
            一致性( Consistency )、
            隔离性( Isolation )
            持续性( Durability )。
            这四个特性简称为 ACID 特性。
        1 、原子性
        事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
        2 、一致性
        事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
        3 、隔离性
        一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
        4 、持续性
        也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

*/
--
CREATE TABLE BANK AS SELECT * FROM EMP;
--窗口1
UPDATE BANK SET SAL = SAL - 1000 WHERE EMPNO = 7839 AND ENAME = ‘KING‘ AND SAL >= 1000;
UPDATE BANK SET SAL = SAL + 1000 WHERE EMPNO = 7369 AND ENAME = ‘SMITH‘;
--窗口2
UPDATE BANK SET SAL = 10  WHERE EMPNO  = 7839;

/*

事务

事务是为了控制数据异步访问所使用的一种技术

就类似于java中的锁机制 synchronized,只不过功能更加强大

事务不能进行嵌套,当我们开启一个事务的之后作的每一次dml语句都属于这个事务

在oracle里面

事务的开启

执行一个dml语句就会开启一个事务

他会把当前dml语句操作的数据进行锁定,别人在操作这些数据的时候就需要等锁

事务的结束

当事务结束的时候会释放掉当前事务所拥有的锁

显示的事务结束

rollback:事务的回滚

回到开启事务的之前的状态

commit:事务的提交

将数据写入到数据库

隐式的事务结束

执行DDL(创建表)语句会提交当前事务

正常退出数据库会提交事务

非正常退出会回滚事务

制造oracle数据库的死锁

窗口1

UPDATE EMP SET SAL = 888 WHERE EMPNO = 7788;

窗口2

UPDATE EMP SET SAL = 666 WHERE EMPNO = 7934;

窗口1

UPDATE EMP SET SAL = 666 WHERE EMPNO = 7934;

窗口2

UPDATE EMP SET SAL = 888 WHERE EMPNO = 7788;

ORACLE死锁是非常影响性能的,所以有自己的死锁检测机制

Oracle查询也会开启事务

SELECT * FROM EMP FOR UPDATE;

事务的隔离级别

定义

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

更新丢失

两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了

两个事务同时操作一条数据,如果没有锁,那么我正在更改的数据可能会覆盖别人的数据

脏读

一个事务读取到了另一个事务未提交的数据操作结果

如果A线程更新数据为888,然后锁定,如果这个时候b线程可以看到这个数据

不可重复读

一个事务对同一行数据重复读取两次,但是却得到了不同的结果

虚读

别的事务对其做了修改操作

幻读

别的事务对其做了 新增 删除 操作

SQL定义了一些级别去避免这些问题

未授权读取,也称为读未提交(Read Uncommitted)

可以避免更新丢失,但是不能避免脏读

授权读取,也称为读提交(Read Committed)

可以避免脏读,但是不能避免  不可重复读

可重复读取(Repeatable Read)

避免了脏读和虚读和幻读的删除操作

但是不能避免幻读的新增操作

序列化      序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行

事务的四大特征

原子性( Atomicity )、

一致性( Consistency )、

隔离性( Isolation )

持续性( Durability )。

这四个特性简称为 ACID 特性。

1 、原子性

事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2 、一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

3 、隔离性

一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4 、持续性

也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

*/

--

CREATE TABLE BANK AS SELECT * FROM EMP;

--窗口1

UPDATE BANK SET SAL = SAL - 1000 WHERE EMPNO = 7839 AND ENAME = ‘KING‘ AND SAL >= 1000;

UPDATE BANK SET SAL = SAL + 1000 WHERE EMPNO = 7369 AND ENAME = ‘SMITH‘;

--窗口2

UPDATE BANK SET SAL = 10  WHERE EMPNO  = 7839;

时间: 2024-10-18 11:37:41

Oracle - 数据更新 - 事务的相关文章

Oracle core05_事务和一致性

事务和一致性 oracle的redo和undo机制保证了数据库的ACID特性,以及高性能和可恢复特性. redo的数据是记录着数据块变更的顺序的正向数据流, commit时,保证redo同步持久化,保证高性能. 恢复的时候,顺序的应用日志. redo的机制相对比较简单. undo记录着数据块的前映像. 保证事务的特性,数据只有在commit后才可见. 提供读一致性,保证读写互不阻塞. 一方面,在undo segment header中transaction table中记录着事务,并在undo的

oracle数据库事务相关【weber出品必属精品】

事务的概念:事务:一个事务由一组构成一个逻辑操作的DML语句组成 事务有开始有结束,事务以DML语句开始,以Conmmit和Rollback结束.以下情况会使得事务结束: 1. 执行COMMIT 或者 ROLLBACK 语句 2. 执行DDL或者 DCL语句 3. 用户退出 4. 系统崩溃 一个事务可以包含下列语句: 1. 对数据做出一致性修改的DML语句 2. 一个 DDL 语句 3. 一个 DCL语句 DDL与和DCL语句执行的过程: 1. 首先发出COMMIT; 2. 执行对数据字典的DM

Oracle 基于事务的临时表在11g和12C下的区别

Oracle 基于事务的临时表在11g和12C下的区别下,可以看到收集临时表的统计信息后,前者记录被清空,后者没有,这是个很重要的区别.在公司环境上用的是12C,在现场用的是11g,使用临时表会造成时快时慢,之前我有帖子http://blog.csdn.net/stevendbaguo/article/details/39964807,用了hint之后,也不是特别好,于是直接采集,结果临时表被清空.解决的方法是:建基于session的临时表,且每次用完之后要truncate,要不然,会有问题.

oracle ITL(事务槽)的理解

一.ITL描述: ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块所有发生的事务,一个itl可以看作是一条事务记录.当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位.如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回

Oracle一个事务中的Insert和Update执行顺序

今天碰到了一个奇怪的问题,是关于Oracle一个事务中的Insert和Update语句的执行顺序的问题. 首先详细说明下整个过程: 有三张表:A,B,C,Java代码中有一段代码是先在表A中插入一条数据,然后再更新表B的两个字段,更新的两个字段是特定值.并且插入和更新在一个事务中. 有个需求需要在表A添加一个Insert的行级触发器,在触发器里,插入表A一行记录后去表B查看更新的两个字段是否满足特定条件, 如果表B的两个字段同时等于特定值,则把表A和表B的数据整合下放到表C.触发器的初衷就是这样

查看oracle的事务级别

[email protected] SQL>delete from scott.emp; 14 rows deleted. [email protected] SQL>SELECT s.sid, s.serial#,   2     CASE BITAND(t.flag, POWER(2, 28))   3        WHEN 0 THEN 'READ COMMITTED'   4        ELSE 'SERIALIZABLE'   5     END AS isolation_le

浅述Oracle分布式事务概念

着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是Instance),来支持前端系统数据访问需要的数据库组织结构.各个节点之间相互独立.自我管理(site autonomy).分布式数据库系统追求的主要目标包括:可用性(availability).准确性(accuray).一致性(concur

Oracle之事务

一,oracle的事务: 是指对数据操作的一系列动作的统称.即:事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的. 事务有四大特性(ACID): 1,原子性(atomicity), 事务中的所有任务要么全部成功,要么全部失败.不能存在部分成功,部分失败.比如银行转账,A向B转200元,A账户余额少200元,B账户余额多200元.不能出现A账户少200元而B账户余额没多出200元. 2,一致性(consistency), 事务将数据库从一种一致状态转变为下一

Oracle数据更新、事务处理、数据伪列

一.数据的更新操作 DML操作语法之中,除了查询之外还有数据的库的更新操作,数据的更新操作主要指的是:增加.修改.删除数据,但是考虑到emp表以后还要继续使用,所以下面先将emp表复制一份,输入如下指令: CREATE TABLE myemp AS SELECT * FROM emp; 这种语法是Oracle中支持的操作,其他数据库不一样. 1.数据增加 如果现在要想实现数据的增加操作,则可以使用如下的语法完成: INSERT INTO 表名称 [(字段1,字段2,-)] VALUES(值1,值