事务处理是将多个操作或者命令一起执行,所有命令全部成功执行才意味着该事务的成功,任何一个命令失败都意味着该事务的失败。
以银行转账为例(100块都不给),
A要给B 转账100元,
A转账的指令已经成功发出,而B 由于未知的原因接收失败,
如果两个命令单独执行,那么A账户少了100块,但是B又没收到100块,显而易见是不合理的;
如果将A向B 转账100元当成一个事务处理,那么由于B 接收的失败,整个转账事务都将失败,A不会少100,B更不会增加100,这个时候“100块都不给”才是合理的情况。
因此,事务处理是不是一荣俱荣,而是一毁全毁。
接下来介绍MySQL数据库中如何进行事务处理以及锁定。
0 数据库事务处理相关命令
进行的操作 | 命令 |
---|---|
查看存储引擎 | SHOW CREATE TABLE 表名; |
更改引擎 | ALTER TABLE 表名 ENGINE=新引擎名; |
回滚 | ROLLBACK; |
声明事务开始 | BEIGIN; |
事务提交 | COMMIT; |
查询自动提交功能状态 | SELECT @@AUTOCOMMIT; |
设置自动提交功能 | SET AUTOCOMMIT=0或1; |
设置分离水平 | SET SESSION TRANSACTION ISOLATION LEVEL 分离水平; |
1 存储引擎
MySQL数据库的存储引擎是可以选择改变和替换的(可替换存储引擎构架,Pluggable Storage Engine Architecture)。MySQL主要有8种存储引擎:
存储引擎 | 特征 |
---|---|
MyISAM | 高速引擎,不支持事务处理 |
InnoDB | 支持行锁定以及事务处理,速度比MyISAM稍慢 |
ISAM | MyISAM的前身 |
MERGE | 将多个MyISAM类型的表作为一个表来处理的引擎 |
MEMORY,HEAP | 只在内存上保存数据 |
Falcon | 一种新的存储引擎,支持事务处理 |
ARCHIVE | 将数据压缩后保存(只能支持INSERT/SELECT操作 |
CSV | 以CSV形式保存数据(应用于跨平台数据交换) |
MySQL的存储引擎种类和特征
(1)查看存储引擎 SHOW CREATE TABLE 表名;
查看某表使用的存储引擎,语法代码如下:
`SHOW CREATE TABLE 表名;`
- 1
如,要查看表customer的存储引擎,可以输入代码:
`SHOW CREATE TABLE customer;`
- 1
如图表所示ENGINE=
后面显示的就是存储引擎。
(2)更改存储引擎ALTER TABLE 表名 ENGINE=新引擎名;
若要更改存储引擎,可以使用代码:
>ALTER TABLE 表名 ENGINE=新引擎名;
- 1
eg:将表customer的存储引擎修改为MyISAM,输入指令:
ALTER TABLE customer ENGINE=MyISAM;
- 1
2 事务处理
之前讲到,事务处理是一毁全毁,因此事务中任意一个任务或指令失败,整个事务都将失败。那是怎么实现的呢?方法是时间中多个任务全部成功,则任务成功结束,并且会进行提交(COMMIT),如果任何一件任务失败,则强制回滚(ROLLBACK)到初始状态。
事务处理涉及到三个最重要的命令:BEGIN,ROLLBACK,COMMIT,分别表示声明事务开始,回滚和确认提交。
(1)回滚演示(ROLLBACK)
首先将表格customer 的存储引擎设置为InnoDB,
确认表格数据;SELECT * FROM customer;
事务开始;BEGIN;
删除表格数据;DELETE FROM customer;
再次查看表格数据;SELECT * FROM customer;
回滚到初始状态;ROLLBACK;
再次查看表格数据;SELECT * FROM customer;
可以看到,当执行ROLLBACK;
之后,删除的记录又恢复到了BEGIN
之前的状态,如果将ROLLBACK 换成COMMIT,那么事务将会提交,删除的记录就不能恢复了。
(2)自动提交
当搜索引擎为MyISAM时,因为不支持事务处理,因此命令一旦执行,就一定会提交,这种默认的提交方式被称为自动提交。
而当搜索引擎设置为InnoDB时,可以设置自动提交功能是否开启,当自动提交功能为ON时,命令执行就会提交(COMMIT),而自动提交设置为OFF 时,必须执行COMMIT才提交,可以使用ROLLBACK进行回滚。
查询当前自动提交功能状态:
>SELECT @@AUTOCOMMIT;
- 1
设置自动提交功能:
>SET AUTOCOMMIT=0或1;
- 1
如图,将自动提交设置为OFF,插入一条记录,然后使用回滚ROLLBACK,再次查看记录,会发现不见了。
(3)部分回滚 SAVEPOINT
直接ROLLBACK会回滚到BEGIN开始之前的地方,而通过SAVEPOINT可以保存一个点,通过ROLLBACK TO SAVEPOINT就可以回滚到保存点了,也就实现了“想去哪就去了哪”。
部分回滚主要有两个步骤:
①保存点
>SAVEPOINT 保存点名;
- 1
②回滚到保存点
>ROLLBACK TO SAVEPOINT 保存点名;
- 1
eg:
(4)不能事务处理的命令(直接提交)
大部分命令都可以通过事务处理(BEGIN -ROLLBACK- COMMIT)进行操作,但是:
- DROP DATABASE;
- DROP TABLE;
- DROP;
- ALTER TABLE
不能通过事务处理,会直接COMMIT;