大家好,我是热心的大肚皮,皮哥。
什么是事务
起源
对于程序猿来说,任务就是把现实世界的业务场景映射到数据库世界中。比如,银行为了存人们的存款建一个account表:
create table account (
id INT NOT NULL AUTO_INCREMENT COMMENT '自增id',
name VARCHAR(100) COMMENT '名称',
balance INT COMMENT '余额',
PRIMARY KEY (id)
) Engine=InnoDB CHARSET=utf8;
狗哥和猫爷是一对好朋友,狗哥有11元,猫爷只有2元,突然有一天,猫爷向狗哥借了10元,狗哥去银行输入了猫爷的账号和10元的转账金额。对于数据库来说,执行了以下两句:
update account set balance = balance -10 where name = '狗哥';
update account set balance = balance +10 where name = '猫爷';
如果执行了一条,突然断电,这应该怎么办呢?其实我们想让某些数据库操作符合现实世界中的状态转换,其中转换的规则有好几条,我们慢慢说。
现实生活中,转帐是一个不可分割的操作,要么做,要么全不做,这种特性就是所谓的原子性。
我们生活的世界有各种规则,例如人民币最大面值100元,红绿灯只有3个颜色,转账一人金额变少,那么肯定有一个人金额变多等等,数据库只关注数据的状态,只要数据符合现实世界的约束或者我们的规则,我们就可以说是符合一致性的。
数据的两种状态转换应该是互补影响的,例如,10元钱分两次转分别是a和b,每次5元,在a操作和b操作的执行顺序有一定的规律,互相不会影响到,也就是不仅要保证这些操作以原子性方式执行,还有保证其他的状态转换不影响本次的操作。
指数据修改完成后,都应该在磁盘中保留下来,不论发生什么事故,本次操作的影响不会丢失。
需要ACID一个或者多个特性的数据库的操作就是事务。
事务的状态
分为以下几个:
活动的(active):事务对应数据库操作在执行过程中。
部分提交的(partially committed):事务的最后一个操作完成,但是都在内存中,并没有刷新到磁盘。
失败的(failed):事务处于活动或者部分提交时,遇到了停电,系统错误等。
中止(aborted):事务执行了半截而变为失败的状态。
提交的(committed):刷到磁盘。
下篇预告【mysql事务的前世今生-redo日志】