热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PL/SQL存储过程是否是事务?-ArePL/SQLstoredprocedurestransactions?

ArePLSQLstoredprocedurestransactions?Whenatrigger,procedureorfunctionruns,isitatrans

Are PL/SQL stored procedures transactions? When a trigger, procedure or function runs, is it a transaction? I usually end my procedures with COMMIT and when an error occurs I use ROLLBACK! Is it wrong?

PL / SQL存储过程是否是事务?当触发器,过程或函数运行时,它是一个事务吗?我通常用COMMIT结束我的程序,当发生错误时我使用ROLLBACK!这是错的吗?

I'am not asking about START TRANSACTION into procedures but I want to know if they are transactions.

我没有问过START TRANSACTION进入程序,但我想知道它们是否是交易。

Thank you.

3 个解决方案

#1


3  

Are PL/SQL stored procedures transactions? When a trigger, procedure or function runs, is it a transaction?

PL / SQL存储过程是否是事务?当触发器,过程或函数运行时,它是一个事务吗?

No. A transaction starts with the first DML encountered and ends when it encounters a COMMIT or ROLLBACK. A transaction can comprise many function and procedure calls and DML statements and trigger code. On the other hand, you can create a procedure that comprises of many transactions by issuing lots of COMMITs.

否。事务从遇到的第一个DML开始,在遇到COMMIT或ROLLBACK时结束。事务可以包含许多函数和过程调用以及DML语句和触发器代码。另一方面,您可以通过发出大量COMMIT来创建包含许多事务的过程。

I usually end my procedures with COMMIT and when an error occurs I use ROLLBACK! Is it wrong?

我通常用COMMIT结束我的程序,当发生错误时我使用ROLLBACK!这是错的吗?

Wrong is a strong word. Let's just say it's not a good practice. Making (packaged) functions and procedures is all about modularization: making reusable pieces of code. When a function/procedure contains ROLLBACK or COMMIT statements, it stops being reusable as it messes up the transaction of the caller. So it's better not to use ROLLBACK or COMMIT in your procedures and leave it to the topmost caller.

错误是一个强有力的词。我们只是说这不是一个好习惯。制作(打包)函数和过程都是关于模块化的:制作可重用的代码片段。当函数/过程包含ROLLBACK或COMMIT语句时,它会停止可重用,因为它会扰乱调用者的事务。因此,最好不要在程序中使用ROLLBACK或COMMIT,并将其留给最顶层的调用者。

You could use SAVEPOINTS throughout your code which makes sure a single function or procedure doesn't leave open parts of a transaction. But for esthetical reasons I prefer to not use SAVEPOINTS. For me, it's just five lines of unnecessary code, because I know my caller function will handle the transaction just nicely.

您可以在整个代码中使用SAVEPOINTS,这样可以确保单个函数或过程不会保留事务的开放部分。但出于美学原因,我宁愿不使用SAVEPOINTS。对我来说,这只是五行不必要的代码,因为我知道我的调用函数会很好地处理事务。

Exception is when you create an autonomous procedure, which is by definition a single transaction and thus needs to end with a COMMIT.

例外情况是您创建一个自治过程,根据定义,它是一个单独的事务,因此需要以COMMIT结束。

UPDATE

Note that a RAISE_APPLICATION_ERROR or a RAISE [exception name] statement will also automatically rollback your PL/SQL block as a single atomic unit. Which is of course a desirable effect as it doesn't leave you with uncommitted changes.

请注意,RAISE_APPLICATION_ERROR或RAISE [exception name]语句也会自动将PL / SQL块作为单个原子单元回滚。这当然是一个理想的效果,因为它不会给你带来未提交的更改。

SQL> create table mytable (id int)
  2  /

Table created.

SQL> create procedure p
  2  as
  3  begin
  4    insert into mytable values (2);
  5    raise_application_error(-20000,'My exception');
  6  end;
  7  /

Procedure created.

SQL> select *
  2    from mytable
  3  /

no rows selected

SQL> insert into mytable values (1)
  2  /

1 row created.

SQL> exec p
BEGIN p; END;

*
ERROR at line 1:
ORA-20000: My exception
ORA-06512: in "X.P", regel 5
ORA-06512: in regel 1


SQL> select *
  2    from mytable
  3  /

        ID
----------
         1

1 row selected.

#2


0  

Off course its not a transaction but a modification. And you dont need to specify Commit everytime to save your transaction. In Oracle for example all individual DML statements are atomic (i.e. they either succeed in full, or rollback any intermediate changes on the first failure) (unless you use the EXCEPTIONS INTO option, which I won't go into here). Consider an example above: If you wish a group of statements to be treated as a single atomic transaction, you'd do something like this:

当然,这不是交易,而是修改。而且您不需要每次都指定Commit来保存您的交易。例如,在Oracle中,所有单独的DML语句都是原子的(即它们要么完全成功,要么在第一次失败时回滚任何中间更改)(除非你使用EXCEPTIONS INTO选项,我不会在这里讨论)。考虑上面的一个例子:如果您希望将一组语句视为单个原子事务,您可以执行以下操作:

BEGIN
  SAVEPOINT start_tran;
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO start_tran;
    RAISE;
END;

That way, any exception will cause the statements in this block to be rolled back, but any statements that were run prior to this block will not be rolled back.

这样,任何异常都将导致回滚此块中的语句,但不会回滚在此块之前运行的任何语句。

Note that I don't include a COMMIT - usually I prefer the calling process to issue the commit.

请注意,我不包含COMMIT - 通常我更喜欢调用进程来发出提交。

#3


0  

PL/SQL is a Modification, not a transaction. A Transaction is a list of Modifications and Read-only operations. If you have a

PL / SQL是修改,而不是事务。事务是修改和只读操作的列表。如果你有

update
insert
pl/sql
update
rollback

the PL/SQL will not make a change to the database, even if the pl/sql is executed.

即使执行了pl / sql,PL / SQL也不会对数据库进行更改。


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
徐韦志弘宇靖宏
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有