广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Oracle事务(transaction)详解
  • 357
分享到

Oracle事务(transaction)详解

2024-04-02 19:04:59 357人浏览 泡泡鱼
摘要

目录一、数据异常二、隔离级别:1、设置隔离级别三、数据库锁:1、oracle中的锁四、事务组成:五、事务的分类:1、显式事务:2、隐式事务:六、事务控制命令1、提交事务2、回滚事务七

一、数据异常

因为Oracle中支持多个事务并发执行,所以会出现下面的数据异常。

  • 脏读(Dirty Read):事务T1更新了一行数据,还没有提交所做的修改,T2读取更新后的数据,T1回滚,T2读取的数据无效,这种数据称为脏读数据。
  • 不可重复读(UNrepeatable Read):事务T1读取一行数据,T2修改了T1刚刚读取的记录,T1再次查询,发现与第一次读取的记录不相同,称为不可重复读。
  • 幻读(Phantom Read):事务T1读取一条带WHERE条件的语句,返回结果集,T2插入一条新纪录,恰好也是T1的WHERE条件,T1再次查询,结果集中又看到T2的记录,新纪录就叫做幻读。

事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。

二、隔离级别:

针对读取数据时可能产生的不一致现象,在sql92标准中定义了4个事务的隔离级别:

  • NO_TRANSACTioN 不支持事务
  • READ_UNCOMMITED 允许脏读、不可重复读、幻读
  • READ_COMMITED 允许不可重复读、幻读,不允许脏读
  • REPEATABLE 允许幻读,不允许脏读、不可重复读
  • SERIALIZABLE 脏读、不可重复读、幻读都不允许

Oracle默认的隔离级别是read committed。

Oracle支持SQL92标准的READ_COMMITED、SERIALIZABLE,自身特有的Read only和Read write隔离级别。

  • Read only:事务中不能有任何修改数据库中数据的操作语句,是Serializable的一个子集。
  • Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用。

1、设置隔离级别

设置一个事务的隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
SET TRANSACTION READ ONLY; 
SET TRANSACTION READ WRITE;

注意:这些语句是互斥的,不能同时设置两个或两个以上的选项。

设置单个会话的隔离级别:

ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;

三、数据库锁:

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。

  • 排它锁:(X锁,eXclusive Locks) 
    当有DML语句执行的时候,设计的行都会加上排它锁,其他事物不能进行读取修改。
  • 共享锁:(S锁,Shared Locks) 
    加了共享锁的数据,可以被其他事物读取,但不能修改。如select语句。

为了保证性能:乐观锁,悲观锁

  • 悲观锁:每次都是假设数据肯定会冲突,数据开始读取时就把数据给锁住。
  • 乐观锁:每次都是假设一般情况下不会发生数据冲突,只有数据更新提交的时候,才会对数据的冲突与否进行检测,如果发生冲突,返回错误信息让用户处理。

在Oracle中最主要的锁是DML锁(data locks,数据锁),DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

1、Oracle中的锁

锁有“共享锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁” (一次锁住一条记录),“页级锁” (一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁” (锁住整个表)。

(1)共享锁(S锁) 
添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。

lock table in share mode

(2)排他锁(X锁) 
添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。

lock table in exclusive mode

(3)行级共享锁(RS锁) 
通常是通过语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。

select … from for update

(4)行级排他锁(RX锁) 
当进行DML操作时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。

(5)共享行级排他锁(SRX锁) 
添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

lock table in share row exclusive mode

上述几种锁模式中,RS锁是限制最少的锁,X锁是限制最多的锁。当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。

下图列出产生锁定模式的SQL语句:

四、事务组成:

一条或者多条DML,[一条DDL]和一条DCL。

五、事务的分类:

1、显式事务:

  • 显式的调用DCL。
  • 只有用到COMMIT以后才会真正写入数据库,也持久化了。

2、隐式事务:

  • 如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
  • 以下情况为自动提交: 
    1)正常执行完成的DDL语句:create、alter、drop 
    2)正常执行完场的DCL语句GRANT、REVOKE 
    3)正常退出的SQLPlus或者SQL Developer等客户端

六、事务控制命令

1、提交事务

在执行使用COMMIT语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。

2、回滚事务

保存点(savepoint):是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。

设置保存点:

Savepoint a;

删除保存点:

Release Savepoint a;

回滚部分事务:

Rollback To a;

回滚全部事务:

Rollback;

七、示例

银行转帐的例子是最经典的事务示例:

-- 从账户一向账户二转账
DECLARE
    v_money     NUMBER(8, 2); -- 转账金额
    v_balance   account.balance%TYPE; -- 账户余额
BEGIN
    v_money := &转账金额; -- 输入转账金额
  -- 从账户一减钱  
    UPDATE account
    SET
        balance = balance - v_money WHERE     id = &转出账户  
        RETURNING balance INTO v_balance;

    IF SQL%notfound THEN
        raise_application_error(-20001, '没有该账户:' || &转出账户);
    END IF;

    IF v_balance < 0 THEN
        raise_application_error(-20002, '账户余额不足');
    END IF;

  -- 向账户二加钱
    UPDATE account
    SET        balance = balance + v_money    WHERE        id = &转入账户;

    IF SQL%notfound THEN
        raise_application_error(-20001, '没有该账户:' || &转入账户);
    END IF;

  -- 如果没有异常,则提交事务

    COMMIT;
    dbms_output.put_line('转账成功');
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK; -- 出现异常则回滚事务
        dbms_output.put_line('转账失败:');
        dbms_output.put_line(sqlerrm);
END;

到此这篇关于Oracle事务(transaction)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Oracle事务(transaction)详解

本文链接: https://www.lsjlt.com/news/149368.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle事务(transaction)详解
    目录一、数据异常二、隔离级别:1、设置隔离级别三、数据库锁:1、Oracle中的锁四、事务组成:五、事务的分类:1、显式事务:2、隐式事务:六、事务控制命令1、提交事务2、回滚事务七...
    99+
    2022-11-13
  • python django事务transaction源码分析详解
    python Django事务 网上关于django1.6的事务资料很多,但是1.8的却搜不到任何资料,自己要用的时候费了不少劲就是不行,现在记下要用的人少走弯路 version:Django 1.8 事务...
    99+
    2022-06-04
    详解 源码 事务
  • Spring事务Transaction配置的五种注入方式详解
    前段时间对spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。总结如下:Spring配置文件中关于事务...
    99+
    2023-05-31
    spring 注入 ct
  • 事务Transaction 那点事儿
    Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要有始有终,不能半途而废。 事务也是这样,不能做一般就不做了,要么做完,要么就不做。也就是说,事务...
    99+
    2022-10-18
  • oracle事务隔离级别transaction isolation level初识
    前言     数据库事务涵盖多方面的知识及概念。事务具备ACID的特性,如何在高并发事务访问中保障ACID特性的实现,真正匹配或契合大家运营的数据库的业务场景,于是产生了事务隔离级别的概...
    99+
    2022-10-18
  • MySQL transaction事务安全示例讲解
    目录事务安全 transaction事务基本原理自动事务手动事务事务的使用回滚点事务的特点事务安全 transaction 事务 transaction 访问可能更新数据库中各种数据项的一个程序执行单元unit 事务由事...
    99+
    2022-06-18
    MySQLtransaction MySQL事务安全
  • Spring @Transaction 注解执行事务的流程
    前言 相信小伙伴一定用过 @Transaction 注解,那 @Transaction 背后的秘密又知道多少呢? Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢?...
    99+
    2022-11-12
  • MyBatis源码解析之Transaction事务模块
    目录1、回顾2、事务模块2.1 事务接口2.2 MyBatis事务类型2.3 JDBC事务模型2.4 关于自动提交2.5 问题1、回顾 之前介绍了Environment环境类,这其实...
    99+
    2022-11-12
  • 如何理解mysql隐式提交事务transaction
    如何理解mysql隐式提交事务transaction,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。隐式提交事务概述  事务是一个完整...
    99+
    2022-10-18
  • Java与Oracle实现事务(JDBC事务)实例详解
    Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。       JDBC事务是由Connec...
    99+
    2023-05-31
    java jdbc事务 ava
  • oracle数据库事务transaction锁lock模式思考之一
    前言         数据库事务是oracle非常基础又极为重要的概念。之前已经介绍过相关的一些概念,相关文章见下:      o...
    99+
    2022-10-18
  • MySQL数据库事务transaction示例讲解教程
    目录1、什么是事务?2、和事务相关的语句只有这3个DML语句:insert、delete、update3、假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗?4、事务的原理5...
    99+
    2022-11-12
  • oracle不同事务隔离级别与v$transaction flag列分析
    这篇文章主要介绍“oracle不同事务隔离级别与v$transaction flag列分析”,在日常操作中,相信很多人在oracle不同事务隔离级别与v$transaction flag列分析问题上存在疑惑...
    99+
    2022-10-18
  • 解决Django transaction进行事务管理踩过的坑
    概要 Transaction是django进行数据库原子性操作在python层面上的实现。 简单来说, 被transaction.atomic()包裹的代码块只在代码块顺利完成后进行...
    99+
    2022-11-12
  • MySQL transaction事务安全怎么实现
    这篇文章主要介绍“MySQL transaction事务安全怎么实现”,在日常操作中,相信很多人在MySQL transaction事务安全怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-07-02
  • mysql事务详解
    事务的特性(Atomicity) 原子性 -- 回滚日志 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这...
    99+
    2016-12-01
    mysql事务详解 数据库入门 数据库基础教程 数据库 mysql
  • Spring boot 事务无效,报错:Transaction not enabled
    问题描述 使用spring boot + mybatis plus时添加的事务不生效,并且有些方法操作会出现如下异常: c.a.m.s.i.SubscriptionsStatsServiceImpl ...
    99+
    2023-09-06
    spring boot mybatis java
  • MySQL中SET TRANSACTION会不会影响事务
    这篇文章给大家介绍MySQL中SET TRANSACTION会不会影响事务,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MySQL支持SQL:1992标准...
    99+
    2022-10-18
  • MySQL事务(transaction)看这篇就足够了
    目录mysql事务处理(TransAction)一、事务的四个特性(ACID)【面试常考项】二、事务的分类三、开启事务的步骤四、事务并发时出现的问题五、事务的隔离级别总结MySQL事务处理(TransAction) 思考...
    99+
    2022-11-01
  • Oracle数据库事务的开启与结束详解
    目录前言commitTruncate – DDLselect xxx for updateselect…for update使用方法失败的DML 和 exitDCL总结 前言...
    99+
    2022-06-23
    oracle数据库开启事务 oracle开启事务语句 oracle强制结束事务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作