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;

posted @ 2021-09-25 16:01  hickup  阅读(27)  评论(0编辑  收藏  举报