1. MySQL 事务
一、事务简介
事务是可以将一系列DML语句分组操作执行的一种机制
可以根据业务需要将多个DML语句进行分组,每一组操作对应一个事务
在组内的所有DML操作步骤或者都成功,或者都失败
如果组内所有步骤都执行正常,则提交,使数据库记录其操作状态
如果组内有些步骤出现错误或不完整,则取消组内执行的所有操作,使数据库回到操作之前的状态
事务需要遵从ACID原则
二、事务必要性
有些业务领域对数据的一致性,安全性和完整性要求很高,对于数据的存储和操作必须要由支持事务的数据库来承担
银行业务
电信业务
证券业务
政府部门各类审批业务
在线交易业务
……
有些业务领域对数据安全性要求不高,因数据库服务器的意外故障丢失一些数据是可以接受的,因此可以选择不支持事务的数据库
聊天论坛
产品评论
……
三、选择是否使用事务的因素
使用事务的弊端
耗费更多的CPU资源
耗费更多的内存
耗费更多的磁盘空间
如果保证数据完整性比增加系统开销带来的成本重要,那么使用事务
例如:财务系统、银行系统、证券交易系统、电信计费系统、审批系统等
如果访问数据库时由于意外导致丢失几条数据或造成数据不够完整对于业务可以接受,性能更重要,那么不用使用事务
例如:论坛,聊天,评论信息等
四、ACID原则
ACID是事务的四个属性,支持事务的数据库一般都要符合ACID原则
Atomic (原子性)
一个事务中的所有语句作为一个单元要么都成功,要么都取消
Consistent (一致性)
数据库中的数据要满足完整性约束,能确保数据库状态从一个一致性状态转变为另一个一致性状态;例如:前述的银行转账示例中事务开始前张三储蓄账户与信用账户余额之和是10000+(-1000)=9000,事务结束后余额之和也是9000+0=9000,数据要保持前后一致;同时也包括读一致性要求,例如:9:00中发起一个查询,9:10才得到最终结果,期间查询的数据被修改过,9:10得到的查询结果只能是9:00中发起查询那一刻数据的状态,其后修改过的数据不能出现在最终查询结果中
Isolated (隔离性)
事务之间相互隔离,不互相影响。即:未完成的事务对于数据产生的变化对于并发的其他事务不可见
Durable (持久性)
事务成功完成后,所做的所有对数据的变更都会准确地记录在数据库中,这些变更通常以日志的形式记录下来,以确保所做的变更不会丢失
2. MySQL事务存储引擎
INNODB是MySQL的默认存储引擎
INNODB支持事务
mysql> show engines\G
3. MySQL事务控制语句 (TCL)
语句 说明
START TRANSACTION(或BEGIN) 显式开始一个新事务,直到通过COMMIT 或ROLLBACK 显式结束
SAVEPOINT spname 事务中可以回滚到的位置的唯一标识符
COMMIT 永久记录当前事务所做的更改,事务显示结束
ROLLBACK 取消当前事务所做的更改,事务显示结束
ROLLBACK TO spname 取消在savepoint 之后执行的更改,事务未结束
RELEASE SAVEPOINT 删除savepoint 标识符,不会删除任何事务语句
SET AUTOCOMMIT 为当前连接禁用或启用默认autocommit 模式
4. MySQL AUTOCOMMIT模式
默认情况下,MySQL AUTOCOMMIT 模式处于启用状态
意味着每一条DML语句都会产生一个事务
每一条DML语句执行完了都会自动提交commit;因此无法通过commit 或rollback 作为一个单元提交或回滚多个DML语句
有时,会将这种情况误认为根本没有事务,但是情况并非如此
通常使用start transaction;语句来改变autocommit,以显示的方式开启一个事务
start transaction 后面的所有DML语句会当成一个事务的一组操作,直到输入了commit;或rollback;命令事务才已显示的方式结束
MySQL使用commit和rollback语句显示地提交或回滚一个事务
但有些语句会造成事务已隐式的方式按照提交(commit)来结束,这些语句如下所示:
create; alter; drop; grant; revoke; set password; start transaction; truncate 等
例如:start transaction之后执行了一系列DML操作,产生了一个事务,但是执行了一个建表语句,create table a (id int); 这会导致事务以提交(commit)的方式结束,即还没有执行commit命令就使事务以提交的方式提前结束了,所以叫做隐式提交