关键字:事务特性、ACID、事务状态、事务语法、隐式提交
12.1、事务的特性
数据库数据的状态对应了现实世界的状态,现实世界的每一次操作对应了数据库的操作。每一次操作就是一次状态的转换,数据库状态转换要符合现实世界的转换,这些转换规则就是事务的特性。
数据库事务的特性:ACID
(1)原子性:Atomicity
事务中的一组操作不可分割,要么全部成功,要么全部失败。
比如:转账操作要么成功,要么失败。不能扣了一个账号的钱,另一个账号没加钱。
(2)一致性:Consistency
事务执行前后,数据的约束没有被破坏,业务状态保持一致。
比如:事务要保证转账前后整个数据库的余额不变的约束,每个账号的余额不能小于0的约束等等。
(3)隔离性:Isolation
多个事务之间互相不影响,通常使用MVCC或者锁来实现。
比如:多次转账数据不能串。
(4)持久性:Durability
一旦事务提交或者回滚了,这个状态都要持久化到磁盘上,即使数据库发生停电宕机也要保证数据没错。
ACI的关系:
数据库某些操作的原子性(A)和隔离性(I)都是保证一致性(C)的手段,但是不一定能保证。
12.2、事务的状态
事务就是满足ACID四个特性的一个或一组操作。
事务有5个状态:
(1)活动的:active
(2)部分提交的:partially commited
(3)失败的:failed
(4)中止的:aborted
(5)提交的:committed
只有事务处于提交的或中止的状态时,一个事务的生命周期才算结束。
状态的转换:
12.3、事务的语法
12.3.1、开启事务
BEGIN [WORK]
START TRANSACTION [修饰符]
这两个语法都可以开启一个事务,下面的语法可以加入修饰符
修饰符:
(1)READ ONLY:开启一个只读事务
(2)READ WRITE:开启一个读写事务(默认)
(3)WITH CONSISTENT SNAPSHOT:启动一致性读,一致性读就是利用MVCC读,不产生锁
12.3.2、提交事务
COMMIT [WORK]
12.3.3、手动回滚事务
在程序出错时,数据库会自动回滚事务,当然我们也可以手动回滚,语法为:
ROLLBACK [WORK]
ROLLBACK [WORK] [TO [SAVEPOINT] 保存点名称]
12.3.4、保存点
SAVEPOINT 保存点名称
RELEASE SAVEPOINT 保存点名称
12.4、支持事务的存储引擎
目前mysql只有innodb和NDB支持事务,innodb完全支持事务的ACID特性,而NDB只支持ACI特性,不支持持久性(D)的特性。
12.5、隐式提交的sql语句
当我们开启一个事务后,一般情况下,没有执行commit语句事务是不会提交的,但是如果执行了下列语句,那么事务会隐式提交了。
(1)DDL语句,例如:CRETE、ALTER、DROP
(2)使用或修改了mysql数据库中的表
(3)再次开启事务
(4)关于锁的语句,例如:LOCK TABLES
(5)LOAD DATA加载数据的语句
(6)关于mysql复制的语句,例如:START SLAVE
(7)其他管理语句:例如:ANALYZE TABLE、CACHE INDEX…