事务 : 要么都成功,要么都失败
四个特性(ACDI)
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
转钱和收钱这两件事情必须同时完成或者同时失败
不能一个完成一个失败 这就是原子性
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。也就是说事务前后数据的完整性必须保持一致。
最终一致性 : 能量守恒
隔离性(Isolation)
隔离性是指一个事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。
多个用户同时操作不会乱转钱
脏读
一个事务读取了另一个事务未提交的数据
幻读
指一个事务内读取到了另外一个事务插入的数据 (一般为行影响 多了一行)
不可重复读
一个事务内读取某一行数据,多次读取的结果不同(不一定是错的)
持久性(Durability)
持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。此时即使数据库发生故障,修改的数据也不会丢失。接下来其他的操作不会对已经提交了的事务产生影响。
如果没有转钱 断电了 那就恢复原样
如果转完钱了 断电了那就持久化到数据库
在mysql中测试
事务在mysql中是默认开启事务提交的的
当我们要手动处理事务的时候,关闭事务自动提交
- set autocommit = 0 //关闭
- set autocommit = 1 //开启
事务开启
- start transaction --标记事务的开启 在这个标记后的sql都在一个事务内
- insert xx
- 成功 commit
- 失败rollback
- 保存点savepoint
- 撤销保存点release savepoint
- 回滚到保存点 rollba to savepoint
create table trade(
id int not null auto_increment comment '序号',
name varchar(10) comment '名字',
money decimal(8,1) comment '存款',
primary key (id)
);
insert into trade (name, money)values ('A',1000),('B',6000);
set autocommit = 0 ;
start transaction ;
update trade set money = money+1000 where name = 'A';
update trade set money = money-1000 where name = 'B';
commit ;
rollback ;
set autocommit = 1 ;
在执行start transaction ; 后
只有整个事务都成功执行才能点击commit
若还没执行之前 执行rollback AB都会重置 1000 和6000
但在执行commit后 在执行rollback 就无效 因为数据已经写入数据库持久化了
在最后记得开启set autocommit = 1 ;