- 什么是事务?我们首先开看一个场景
甲的银行账户有200元存款,乙也有200元存款,甲向乙转账100元,如果由于某种原因转账失败,甲和乙查询各自账户时自己的存款不会发生变化并不会出现甲的账户变成100而乙的账户仍是200,如果成功,则甲的账户一定是100,已的账户一定是300,即整个流程要么都执行,要么都不执行。
那么什么是事务呢?所谓事务就是一个操作序列,要么都不执行,要么全部执行成功,他是最小单位,不可再分割。
- 事务的四大特性(ACID)
- 原子性
包裹在事务中的各个操作是一个整体,不可分割,要么都执行,要么都不执行- 一致性
即在一次事务中,最后的结果一定是一致的(比如转账的场景中,如果失败,账户余额不变,不会因为中间的某个步骤出现故障导致甲的账户变成100,而乙仍然是200)- 隔离性
在一个事务执行commit前,对另一个事务是不可见的- 持久性
一旦提交,其修改后的结果将永久保存在数据库
- 模拟转账场景来更深入理解事务
说明:整个场景需要开启两个终端连接数据库进行操作
- 准备数据
create table account( id int unsigned not null primary key auto_increment, name varchar(20) not null, customer_id varchar(20) not null unique, money int not null default 0 );
insert into account values(0,'甲',1111,200),(0,'乙',2222,200);
- 如何开启事务呢,两种方式:1. begin;2. start transaction。最后submit提交事务
甲向乙转账100元
begin;
select * from account where customer_id=1111;
update account set money=money-100 where customer_id=1111;
update account set money=money+100 where customer_id=2222;
commit
原子性就是这四句语句是一个整体,不可分割,要么都执行,要么都不执行
一致性就是当执行到第三句后出现系统故障执行失败,不会出现甲账户减少100乙账户不变或乙账户增加100甲账户不变
隔离性就是在提交前,该事务不受其他事务影响,并且该事务提交前的结果对其他事务是透明的
图一
上图左侧是开启事务执行转账,但还没有执行commit提交,右侧为另一台终端连接该数据库查询结果发现左侧事务未提交的结果在右侧并未生效。
既然右侧查询出的数据甲仍然是200,那么我们在右侧再开启一个事务,让甲向乙转账200会发生什么呢
如上图所示,SQL语句并不会执行修改操作,而是会等待左侧事务提交,等待一段时间仍未提交则会显示等待锁超时,因此这个事务并不会影响左边的事务
这就是隔离性
- 回滚
在提交前如果不想执行这些操作了,使用
rollback;
进行回滚操作,执行回滚操作后事务也会结束
begin;
update account set money=money+50 where customer_id=2222;
rollback;