事务,乍一看这个词不知其所以然,至少我第一次看到不知道他是干什么用的。要理解它并不难,你可以认为它就是我们在操作数据库时中间的一个通道,这个通道另一端就是数据库,从我们开始执行一个 DML 语句(参考:http://www.mycode.net.cn/database/823.html )开始,就相当于我们在向通道中塞数据或从通道中读取数据,但是要注意,这些数据不会立即到通道的另一端数据库内。只有我们执行了 commit 或者 执行了一条 DDL 语句时,系统会将我们之前执行的所有 DML 语句真正的应用到通道的另一端数据库中。那这个通道存在的价值是什么呢?那就只支持事务的回滚,意思就是如果我们对数据库做了一些错误的 DML 操作,那么可以通过回滚事务的方式回到执行了错误的 DML 语句之前,这就是事务的简单理解。


事务的组成

  1. 一个或多个 DML 语句
  2. 一个 DDL 语句
  3. 一个 DCL 语句

事务的四大特性

  • 原子性 (Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
  • 一致性 (Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
  • 隔离性 (Isolation):事务的执行不受其他事务的干扰,当数据库被多个客户端并发访问时,隔离它们的操作,防止出现:脏读、幻读、不可重复读。
  • 持久性 (Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

事务的提交和回滚

提交:

  • 显示提交:commit
  • 隐式提交,执行过DDL语句的同时系统会自动帮你提交事务。

回滚:

  • 显示回滚:rollback
  • 隐式回滚:断电、宕机、非正常退出

事务的保存

事务可以通过 savepoint 命令进行保存,比如 savepoint backup,在恢复的时候使用 rollback to savepoint backup 就可以恢复。整个恢复的过程如下图(来自传智播客教师课件): 2015-07-22_202619 如果我们在执行了 delete 之后使用了 savepoint 保存了一个保存点是A,后面又执行了其他的语句,那么如果使用了 rollback to savepoint A 的情况下,后面执行的 DML 操作都将被回滚。以下是对事务操作的DML语句和事务控制语句。 2015-07-22_202851

事务隔离机制和隔离级别

1、对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题,如下:

  • 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
  • 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
  • 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行。

2、数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题. 3、一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。 事务隔离级别 2015-07-22_202800 lOracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED。Oracle 单独有一种隔离级别是 READ ONLY 就是只读。 lMysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ。