Mysql事务的讲解

事务

事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,比如A转账100元给B,A账户减少100元,B账户增加100元,这就叫事务,要么转账成功,这两个操作都成功,要么转账失败,AB都账户都没有增减,不会出现A减少了100元而B账户没有增加的情况;

原子性(Atomicity)

事务里的操作不可再拆分,事务里的所有操作可以看成一个原子,原子是最小的颗粒,具有不可再分的特性,要么全部执行,要么全不执行;

一致性(Consistency)

一致性是通过原子性来保证的,是指事务执行的结果必然是从一个一致性状态到另一个一致性状态,比如转出的金额和转入的金额一致才能构成事务;

隔离性(Isolation)

隔离性是指各个事务之间互不干扰;

持久性(Durability)

持久性是指事务一旦提交,对数据所做的任何改变,都要记录在永久的存储器中;

事务案例

创建账户表并插入数据

create table account(
	id int(10) primary key auto_increment,
	uname varchar(10) not null,
	balance double(10,2)
);

insert into account values (null,"张三",2000),(null,"李四",2000);

进行转账操作,张三减200,李四加200

//转账操作
update account set balance = balance - 200 where id = 1; 
update account set balance = balance + 200 where id = 2; 

在这里插入图片描述
注意:这时的数据时存在内存中的,如果这时转账有误则需要回滚操作

rollback;

确认无误则提交操作

commit;

事务并发问题

脏读

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,此时另一个事务也访问了这个数据,然后也使用了这个数据,但此时的数据时还没有提交前的数据,那么另一个事务读到的这个数据是"脏数据",依据"脏数据"所做的操作有可能是不正确的;

不可重复读

指在一个事务内多次读同一个数据,此时另一个事务正在修改该数据,当一个事务再读取该数据时,两次读取到的数据可能不一样,因为被称为不可重复读;

幻读

幻读和不可重复读类似,一个事务读取了几行数据,另一个事务此时插入了一些数据,随后当第一个事务再读时会发现多了几行数据,就像发生幻觉一样;

幻读和不可重复读的区别

幻读重点在于新增和删除,不可重复读的重点是修改;
幻读解决需要锁住整表,而不可重复读需要锁住满足条件的行;

事务的隔离级别

  • READ UNCOMMITTED 读未提交的
    可能出现脏读,不可重复读,幻读;

  • READ COMMITTED 读提交的
    可能出现不可重复读,幻读;

  • REPEATABLE READ 重复读(用的最多)
    可能出现幻读;

  • SERIALIZABLE 序列化
    解决所有并发问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值