热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

谈谈对Oracle处理DDL和DML语句的事务管理

在开发过程中,遇到了oracleDDL语句和DML语句需要在一个事务中一块处理的情况,该方法要么成功,要么失败。对于这个问题,sqls

在开发过程中,遇到了oracle DDL语句和DML语句需要在一个事务中一块处理的情况,该方法要么成功,要么失败。对于这个问题,sql s

一、先说问题

在开发过程中,遇到了Oracle DDL语句和DML语句需要在一个事务中一块处理的情况,该方法要么成功,要么失败。对于这个问题,sql server等数据库是可以解决的,因为其能对DDL语句做回滚,而oracle在执行ddl语句时会先执行commit,所以就不能对DDL语句回滚了。

二、事务相关概念

1、 首先,,说说数据库对事务的相关定义:

在数据库中事务是工作的逻辑单元 , 一个事务是由一个或多个完成一组的相关行为的 SQL 语句组成 , 通过事务机制确保这一组 SQL 语句所作的操作要么完全成功执行 , 完成整个工作单元操作 , 要么一点也不执行。 事务具有ACID特性(即:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)),ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所说明(我找了半天也没下载到这个标准,谁有的送我一份啊,呵呵)。

2、我机器的oracle版本为10g,10g对应的jdbc版本为3。看一下JDBC3有关事务概念:

JDBC3提到了事务和分布式事务。对于大家经常说的嵌套事务,没有提及。数据库本质上从来没有过嵌套事务的概念,只是应用程序为了不同的目的将对事务的操作过程嵌套起来,即使是Oracle的自治事务也可划为应用程序(存储过程或是触发器什么的), 从应用角度讲,嵌套事务处理就是应用程序如何将应用层面的嵌套转变为数据库层面的单事务操作, 这方面Java领域的EJB,Spring提供了解决方案,另外提一下JTA,它提供了事务的suspend,resume功能,实质上其实数据库事务那里有什么挂起什么的概念,其仅仅是换了一个数据库连接,这样新的数据库事务开始了,老的数据库事务便不再操作,直接其被resume。)。

那么接下来我们看看JDBC3中对事务的定义:

Transactions are used to provide data integrity, correct application semantics, and a consistent view of data during concurrent access. All JDBC compliant drivers are required to provide transaction support. Transaction management in the JDBC API mirrors the SQL99 specification and includes these concepts:
Auto-commit mode
Transaction isolation levels
Savepoints

三、解决方法

要想解决一个问题,找到问题的关键所在,就等于成功了一半。如上所述,该问题的关键所在又是什么呢?

oracle在执行ddl语句时会先执行commit,所以就不能对DDL语句进行回滚。jdbc事务也不提供相关方法来进行回滚(spring、ejb或许可以,但没测试过,不好说)。

既然应用的一些框架不能提供该功能,就只能自己想办法解决了,怎么解决?反向操作!或许感觉有些麻烦,但不这么做又如何呢,在操作SQL语句成功后,后边跟着反向操作的定义(内部类派上用场了),在一个大的事务中,如果出现异常,在异常的地方把反向操作执行一把即可。再进一步,如果让所有的DDL语句能和DML语句用不同的数据库连接,那么DML语句就不用反向操作了,节省了很多工作量,DML语句用事务的回滚多好啊!当然这样做的前提是,在DDL执行时,不能和DML操作的资源引起冲突,即锁的问题。

推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • PGXC中的两阶段提交机制及其对事务一致性的保障
    PGXC作为一款基于PostgreSQL的分布式数据库系统,利用Sharding技术将数据分散存储于多个数据库实例中。本文探讨了PGXC的两阶段提交过程及其实现事务强一致性的方法。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文探讨了服务化的目标,包括将系统中的独立业务模块垂直划分,形成基础服务层,以及如何通过无状态的基础服务支持上游业务。同时,文章详细讨论了服务子系统的数量控制和划分注意事项,以确保系统的高效性和可维护性。 ... [详细]
  • 8个IDC大数据基础定义解析丨IDC
    本文针对IDC数据行业相关名词术语进行解析,分为4组相关概念,希望大家读完 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 近年来,区块链技术备受关注,其中比特币(Bitcoin)功不可没。尽管数字货币的概念早在上个世纪就被提出,但直到比特币的诞生,这一概念才真正落地生根。本文将详细探讨比特币、以太坊和超级账本(Hyperledger)的核心技术和应用场景。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • 本文介绍了Hadoop的核心组件,包括高可靠性和高吞吐量的分布式文件系统HDFS、分布式的离线并行计算框架MapReduce、作业调度与集群资源管理框架YARN以及支持其他模块的工具模块Common。 ... [详细]
  • 自动驾驶中的9种传感器融合算法
    来源丨AI修炼之路在自动驾驶汽车中,传感器融合是融合来自多个传感器数据的过程。该步骤在机器人技术中是强制性的,因为它提供了更高的可靠性、冗余性以及最终的 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
author-avatar
H801_597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有