2024-03-19
原文作者:吴声子夜歌 原文地址: https://blog.csdn.net/cold___play/article/details/103862325

事务

事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。

概述

事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内部的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败。在编程过程中也经常用到事务。

事务是一组数据库操作的逻辑工作单元,每个事物都是一个原子单位。在一个事务中可以包含一条或多条DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言)语句,这些语句组成一个逻辑整体。在事务中包含的数据库操作是不可分割的整体,要么在一起被执行,要么回滚到执行事务之前的状态。对事务的操作有两个:提交(COMMIT)和回滚(ROLLBACK)。提交事务时,对数据库所做的修改便永久写入数据库。回滚事务时,对数据库所做的修改全部撤销,数据库恢复到操作前的状态。事务可用于操作数据库的任何场合,包括应用程序、存储过程和触发器等。

在数据库的应用中,经常需要使用到事务的概念。例如:银行账户之间的汇款转账操作。该操作在数据库中由以下三步完成:

  • 源账户减少存储金额,例如减少10000。
  • 目标账户增加存储金额,增加10000。
  • 在事务日志中记录该事务。

整个交易过程,我们看做一个事务,如果操作失败,那么该事务就会回滚,所有该事务中的操作将撤销,目标账户和源账户上的资金都不会出现变化:如果操作成功,那么将对数据库永久修改,即使季候服务器断点,也不会影响该修改结果。

事务的特性

事务有4个特性,简称ACID属性:

  • 原子性(Atomicity): 事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
  • 一致性(Consistency): 事务把数据库从一个一致性状态带入另一个一致性状态。
  • 隔离性(Isolation): 对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应该以任何方式依赖于或影响其他事务。
  • 永久性(Durability): 事务完成后,它对数据库的修改永久有效,事务日志能够保持事务的永久性。

事务的类型

一个事务中可以包含多条DML语句,或者包含一条DDL语句,或者包含一条DCL语句。事务开始于第一条SQL语句,在下列之一情况结束:

  • 遇到COMMIT或ROLLBACK命令。
  • 遇到一条DDL或者DCL命令。
  • 系统发生错误、退出或者崩溃。

事务是一系列可以把系统带入一个新的状态的操作,如果事务被提交,则数据库进入一个新的状态,否则数据库恢复到事务以前的状态。在数据库中使用事务的好处是首先可以确保数据的一致性,其次对数据做永久修改之前可以预览以前的数据改变,还可以将逻辑上相关的操作进行分组。

控制事务的方式有两种:

  • 隐式控制
  • 显示控制

隐式控制:

该类型的事务没有明确的开始和结束标志。它由数据库自动开启,当一个程序正常结束或使用DDL语言时会自动提交。如果从SQL PLUS非正常退出或发生系统崩溃,那么系统将自动回滚事务。如果设置AUTOCOMMIT为打开状态(默认关闭),则每次执行DML操作都会自动提交。

语法格式如下:

    SET AUTOCOMMIT ON/OFF

显示控制:

显示方式就是利用commit和rollback命令”显示“地结束事务。

Oracle中的事务不需要设置开始标识,通常遇到登录数据库后,第一次执行DML语句时;或者是当事务结束后,第一次执行DML语句时,事务就开始了。

事务的保存点

在事务中可以根据用户的需要设置保存点。如果让事务回滚到指定位置,需要在事务中预先设置事务保存点(Save Point)。所谓保存点,是指在其所在位置之前的事务语句不能回滚的位置,回滚事务后,保存点之后的事务语句被回滚,但保存点之前的语句依然被有效执行,即不能回滚。

使用SAVEPOINT命令可以设置事务保存点,其基本语法如下:

    SAVEPOINT <保存点名>;

需要说明的是,可以将事务的语句分为几个部分,设置多个保存点,这样在实施事务回滚时,可以根据需要回滚事务到不同的保存点位置。

阅读全文