PL/SQL

PL/SQL 知识量:16 - 57 - 244

15.1 事务控制的基本概念><

什么是事务控制- 15.1.1 -

事务控制是PL/SQL中的核心概念之一,它涉及到管理DML语句所做的更改以及将DML语句分组为事务。一个事务是一组相关的DML语句的逻辑单元,这组语句要么全部成功提交,要么全部取消,以确保数据的一致性。

事务控制的主要语句包括:

  • COMMIT语句:结束当前事务,并使在事务中执行的所有更改都具有持久性。提交还会清除在事务中的所有保存点,并释放事务锁。

  • ROLLBACK语句:将当前事务中所做的工作取消。ROLLBACK TO SAVEPOINT语句则将自上次保存点以来的更改撤消,但不会结束整个事务。

  • SAVEPOINT语句:在事务中标识可以稍后回滚到的点。

另外,事务控制还涉及锁的使用。例如,当执行事务操作时,Oracle会在被作用的表上加表锁,以防止其他用户改变表的结构,同时也会在被作用的行上加行锁,以防止其他事务在同样的行上执行DML操作。为了确保数据库数据的读一致性,不允许其他用户读脏数据(未提交的事务),只有当当前用户提交事务后,其他用户才能读取提交后的数据。

事务控制的必要性- 15.1.2 -

事务控制是编程中非常重要的一个环节,主要有以下几个方面的作用:

  • 确保数据一致性:事务控制可以保证一组相关的操作要么全部成功提交,要么全部取消,从而避免因为中间出现错误导致的数据不一致状态。这对于数据的完整性和准确性至关重要。

  • 提高性能:通过事务控制,可以将多个操作组合成一个事务,这样可以减少系统资源的消耗,提高系统的处理效率。

  • 简化编程逻辑:通过事务控制,可以将一组相关的操作绑定在一起,使得编程逻辑更加清晰,同时也方便代码的管理和维护。

  • 事务隔离级别:可以根据需要设置不同的事务隔离级别,以满足不同的业务需求。例如,一些业务可能要求读操作必须在一个事务中执行,以保证数据的一致性。

因此,在PL/SQL编程中,合理使用事务控制可以大大提高程序的可靠性和性能。

事务的AClD特性及实现- 15.1.3 -

ACID是数据库事务的基本特性,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些特性确保了事务的可靠性。

  • 原子性(Atomicity):事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。这意味着事务内的操作如果失败了,那么将会回滚到事务开始前的状态;如果事务成功,那么事务内的每一项操作都会成功。

  • 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这意味着写入的数据必须完全符合所有的预定义规则,这包括数据的准确性,串行性,以及后续的数据库可以恢复到事务执行前的状态。

  • 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。

  • 持久性(Durability):一旦事务提交,则其结果永久保存在数据库中。即使系统崩溃,重新启动后数据库还能恢复到提交事务后的状态,它的实现主要是通过将数据写到磁盘中。

在PL/SQL中,事务的ACID特性是通过以下方式实现的:

  • 原子性:通过ROLLBACK和COMMIT语句实现。当执行ROLLBACK语句时,将取消事务中的所有操作并回滚到事务开始前的状态;当执行COMMIT语句时,将提交事务中的所有操作并使其具有持久性。

  • 一致性:通过约束、触发器、存储过程和函数等方式来确保数据的一致性。

  • 隔离性:通过锁定机制实现。当一个事务正在对某个数据进行操作时,会对该数据加锁,以防止其他事务对其进行操作,从而保证了隔离性。

  • 持久性:通过将数据写入磁盘来实现。一旦事务提交,其结果将被永久保存在数据库中,即使系统崩溃也不会丢失。

事务的状态- 15.1.4 -

在PL/SQL中,事务可以处于以下状态:

  • 活动状态(Active):当事务正在执行数据库操作时,处于活动状态。

  • 部分提交状态(Partially Committed):当事务已经执行了一部分数据库操作,但没有将执行结果从数据库刷新到磁盘中时,处于部分提交状态。

  • 失败状态(Failed):当事务在活动或部分提交状态下遇到错误(例如,数据库自身错误、操作系统错误或者节点下电等),无法继续执行,或者被人为停止当前事务的执行,此时事务处于失败状态。

  • 中止状态(Aborted):当事务处于失败状态时,数据库会进行回滚操作,即将数据库恢复到事务执行前的状态,此时事务处于中止状态。

  • 提交状态(Committed):当事务将事务执行的结果从内存刷新到磁盘后,处于提交状态。

事务的执行- 15.1.5 -

事务的执行通常涉及以下步骤:

  1. 开始事务:使用SQL命令 BEGIN TRANSACTION 或者隐式地通过执行第一个SQL语句开始一个事务。

  2. 执行SQL语句:在事务中执行一个或多个SQL语句,如INSERT、UPDATE、DELETE等。

  3. 提交或回滚事务:根据事务执行的结果,可以选择提交或回滚事务。提交事务:如果所有SQL语句都成功执行,并且数据的一致性得到维护,则可以使用 COMMIT 命令提交事务,将事务的更改永久保存到数据库中。回滚事务:如果在执行SQL语句时发生错误或者需要撤销事务的更改,可以使用 ROLLBACK 命令回滚事务,将数据库恢复到事务开始前的状态。

  4. 结束事务:在提交或回滚事务后,事务结束。

注意,PL/SQL中的事务是自动提交的,即每执行一条SQL语句,都会自动提交一次。如果需要在多个SQL语句之间保持一致性,可以使用 SAVEPOINT 命令创建一个保存点,以便在需要时回滚到该保存点。

下面是一个简单的PL/SQL事务执行的示例:

BEGIN TRANSACTION; -- 开始事务  
  
INSERT INTO customers (customer_name, contact_name) VALUES ('John Doe', 'John Smith'); -- 执行SQL语句  
  
COMMIT; -- 提交事务  
  
ROLLBACK; -- 回滚事务  
  
END; -- 结束事务

在上面的示例中,首先使用 BEGIN TRANSACTION 开始一个事务,然后执行了一个INSERT语句,之后使用 COMMIT 命令提交事务,最后使用 ROLLBACK 命令回滚事务。可以根据实际情况选择是否提交或回滚事务。