MYSQL之事务
事务的四个特性:ACID
A 原子性:
总结一句话,要么全部成功,要么全部失败
C 一致性:
事务前后,数据总量不变,举例子,A有800,B有200,A转给B100,那么A有700,B有300,两个前后数据加起来还是1000
I隔离性:
多个用户操作的时候,事务之间互不干扰
D持久性:
事务一旦提交成功,就持久化写入数据库中,不会再被回滚
隔离性里面又有隔离级别:
脏读:一个A事务读取到另外一个B事务执行中的结果,就是B还没提交,A就读取了,如果B发生了错误,导致回滚,那么A的数据就是错误的
不可重复读:指在事务A中,读取两次数据,刚好在着两次的间隙中,B事务修改了数据,导致两次的结果不一样,解决办法,在事务A读取数据期间,只允许一个事务对该行进行操作
幻读:这个和不可重复读有点像,指事物A在读取两次数据,两次数据返回的数据条数不一样,这个解决办法就是,允许某一个事务在某一时刻,锁住表
更新丢失:例如事务A在操作往C账户添加200元,事务B也在同时操作C账户添加80元,那么后一个事务的结果会覆盖前一个事务的操作,导致C账户只有80元,200元丢失了,解决办法就是隔离,事务A操作的时候,不允许其他事务进行操作。
可以建立一个表玩一下
create table if not EXISTS account(`id` int not null auto_increment,
`name` varchar(20),
`money` decimal,
primary key (`id`));
-- 关闭自动事务
set autocommit=0;
start transaction
update account set money=money-500 where `name`='hick'; -- A-500
update account set money=money+500 where `name`='erick'; -- B+500
select * from account;
COMMIT; -- 都成功就提交
rollback; -- 失败回滚
set autocommit=1;