Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 存储过程是否在Postgres中的数据库事务中运行?_Database_Postgresql_Stored Procedures_Transactions_Relational Database - Fatal编程技术网

Database 存储过程是否在Postgres中的数据库事务中运行?

Database 存储过程是否在Postgres中的数据库事务中运行?,database,postgresql,stored-procedures,transactions,relational-database,Database,Postgresql,Stored Procedures,Transactions,Relational Database,如果存储过程中途失败,那么SP开始时的更改是隐式回滚的,还是我们必须编写任何显式代码以确保SP仅在数据库事务中运行?严格来说,Postgres在版本11之前的ISO/IEC标准中没有定义。这个术语经常被错误地用来指,它提供了与其他RDBMS提供的“存储过程”相同的功能(甚至更多)。主要区别在于事务处理 Postgres 11最终引入了True: 在Postgres中是原子的,除非在外部事务中调用,否则会自动在自己的事务中运行它们总是在单个事务中运行,并完全成功或失败。因此,无法在函数

如果存储过程中途失败,那么SP开始时的更改是隐式回滚的,还是我们必须编写任何显式代码以确保SP仅在数据库事务中运行?

严格来说,Postgres在版本11之前的ISO/IEC标准中没有定义。这个术语经常被错误地用来指,它提供了与其他RDBMS提供的“存储过程”相同的功能(甚至更多)。主要区别在于事务处理

Postgres 11最终引入了True:

在Postgres中是原子的,除非在外部事务中调用,否则会自动在自己的事务中运行它们总是在单个事务中运行,并完全成功或失败。因此,无法在函数中开始或提交事务。不允许在事务上下文中运行的命令,如
VACUUM
CREATE DATABASE
CREATE INDEX concurrent

函数和触发过程始终在 由外部查询建立的事务-它们无法启动或关闭 提交该事务,因为没有上下文可供它们提交 执行。但是,包含
异常
子句的块 有效地形成一个子事务,该子事务可以回滚而无需 影响外部交易

默认情况下,PL/pgSQL函数中发生的任何错误都将中止 功能的执行,以及周围事务的执行 也您可以使用
BEGIN
异常
子句阻塞

存在例外情况,包括但不限于:

  • 写入日志文件的数据
  • 重要:某些PostgreSQL数据类型和函数具有特殊规则 关于交易行为。特别是,对 序列(因此使用
    serial
    声明的列的计数器) 对所有其他事务都立即可见,并且不会滚动 如果进行更改的事务中止,返回

  • 准备好的发言

    • 演示
  • dblink调用(或类似调用)


手册中所有内容的可能副本。包括技术上在PostgreSQL中没有存储过程这一事实