文章目录
数据库事物——基础篇
1. 概述
在MySQL中,数据库事物支持是在引擎层实现的,我们知道,MySQL是一个支持多引擎的系统,但不是所有的引擎都支持事物,比如MySQL原生的MyISAM引擎就不支持事物,这也是MyISAM被InnoDB代替的重要原因之一;
本篇文章将以InnoDB为例来说明数据库事务!
1.为什么需要数据库事物
1. 银行转账例子
为什么需要数据库事务,下面来看一个比较典型的简单例子;
银行转账问题,假如A账户要给B账户转账¥1000,此时就要操作数据库了,如下图所示:
如上图,要分为两个步骤,那么很多问题就会发生在这,例如:
- A账户减少¥1000的操作执行完成后,系统突然出现故障,导致B账户增加1000这个操作不能够完成;
- 转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录;
- 同时又有另一个用户转账给B账户,由于同时对B账户进行操作,导致B账户金额出现异常;
那么将上述操作包含在一个数据库事物后,又是怎么保证解除那些问题的呢?对于上面的转账例子,可以将转账相关的所有操作包含在一个事务中
BEGIN TRANSACTION
A账户减少100元
B账户增加100元
COMMIT
- 当数据库操作失败或者系统出现崩溃,系统能够以事务为边界进行恢复 ,不会出现A账户金额减少而B账户未增加的情况;
- 当有多个用户同时操作数据库时,数据库能够以事务为单位进行并发控制,使多个用户对B账户的转账操作相互隔离 ;
事务使系统能够更方便的进行故障恢复以及并发控制,从而保证数据库状态的一致性。
2. 什么是数据库事物
定义:数据库事务是构成单一逻辑工作单元的操作集合
一个典型的数据库事务如下所示
BEGIN TRANSACTION //事务开始
SQL1
SQL2
COMMIT/ROLLBACK //事务提交或回滚
关于事务的定义有几点需要解释下:
- 1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
- 2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
- 3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
- 4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。
2. 数据库事务的基本操作
这里我们建一个测试表:
mysql> create table test(
-> id int primary key auto_increment,
-> name varchar(20),
-> adress varchar(20) );
然后开始事物操作:
-
事物的开始使用:start transaction ;
-
事物中创建一个保存点使用:savepoint 保存点名 ;
-
回到保存点:rollback to 保存点名 ;(这一步只能在commit前执行,否则会报错)
-
当没有保存点时,可用rollback回到事物的起始点;当使用rollback,也代表这