> For the complete documentation index, see [llms.txt](https://shepherd-xie.gitbook.io/be-a-javaer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shepherd-xie.gitbook.io/be-a-javaer/di-4-zhang-oracle-shu-ju-ku-ji-chu/section-15.md).

# 第 15 节 事务处理

传统关系型数据库的最大特征是具有事务的支持能力，最大的好处是可以保证操作数据的完整性。即：在进行数据更新操作的时候，如果某一个更新操作将会导致多张数据表的同时更新，那么这些更新要么一起成功，要么一起失败。事务处理是关系型数据库的最大特征，但也是性能影响的平静所在。

## 事务的控制原理

Session（会话），在Oracle数据库之中，同一个数据库可以连接多次。每一个连接到数据库上的用户在数据库之中都会使用一个session来描述。

在进行事务控制的时候一定要遵循ACID原则：

> ACID，是指数据库管理系统（DBMS）在写入或更新资料的过程中，为保证事务（transaction）是正确可靠的，所必须具备的四个特性：原子性（atomicity，或称不可分割性）、一致性（consistency）、隔离性（isolation，又称独立性）、持久性（durability）。
>
> 在数据库系统中，一个事务是指：由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐，从原账户扣除金额，以及向目标账户添加金额，这两个数据库操作的总和，构成一个完整的逻辑过程，不可拆分。这个过程被称为一个事务，具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段内有所说明。
>
> * 原子性：一个事务（transaction）中的所有操作，要么全部完成，要么全部不完成，不会结束在中间某个环节。事务在执行过程中发生错误，会被恢复（Rollback）到事务开始前的状态，就像这个事务从来没有执行过一样。
> * 一致性：在事务开始之前和事务结束以后，数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则，这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
> * 隔离性：数据库允许多个并发事务同时对其数据进行读写和修改的能力，隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别，包括读未提交（Read uncommitted）、读提交（read committed）、可重复读（repeatable read）和串行化（Serializable）。
> * 持久性：事务处理结束后，对数据的修改就是永久的，即便系统故障也不会丢失。

## Oracle中的事务处理

在oracle里面提供有许多的事务处理命令，这里面重点关注两个命令：

* commit：将说有的操作提交；
* rollback：当数据操作产生问题的时候就需要进行回滚处理，回滚到上一次的提交点；

在oracle里面对于事务的支持控制本身是提供有一个操作的缓冲区的，也就是说用户所发出的所有的更新操作并不是直接立刻反映到数据库上，用户如果发现更新没有任何问题，则提交事务，如果发现更新有任何问题，则进行回滚。

1. 删除myemp表中的全部记录：`DELETE FROM myemp;`；
2. 但是这个时候所有的数据并没有通过数据库直接删除，而是将操作保存在一个缓冲区中，如果发现有问题，则可以使用rollback回滚，回滚之后则返回到上一个提交点；
3. 如果现在发现更新没有问题，则可以使用commit，向数据库发出真正的更新操作。

在以后进行业务设计与开发的时候才需要进行事务的控制。

## 事务锁

在进行数据库事务的控制过程之中，多个用户同时对同一数据进行操作时要等待正在操作的用户提交或回滚时就称为锁。

1. 定义两个session分别连接包数据库；
2. 【Session-A】现在发出一个更新指令，更新一条数据：

```sql
UPDATE myemp SET sal=9999 WHERE empno=7369;
```

3. 【Session-B】由于第一个Session并没有提交或回滚事务，所以这个时候第二个Session是无法更新7369这行数据的：

```sql
UPDATE myemp SET sal=9999 WHERE empno=7369;
```

4. 【Session-A】执行rollback或commit表示释放掉当前锁住的数据行：
5. 在进行锁定的时候除了更新之外也可采用查询模式：

```sql
SELECT * FROM myemp WHERE empno=7369 FOR UPDATE;
```
