【mysql】---mysql事务

一、Mysql事务

事务:一组原子性的SQL查询,或一个独立的工作单元。通常一个事务对应一个完整的业务。

开始事务;事务结束;提交事务;回滚事务。
在事务进行过程中,未结束之前,DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事务结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据【先在内存操作,只有成功了,事务提交时才同步到磁盘】。

1.1、事务的特性ACID

原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态【事务是最小单位,不可分割】
一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的【事务要求所有的DML语句操作时,必须同时成功或失败】
隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。【事务A和事务B间是隔离的】
持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。【內存的数据会持久化到磁盘】

1.2、并发事务存在的问题

(1).丢失更新(提交覆盖)—写写场景

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。
----解决方案:一个事务操作期间加锁,其他事务不能访问。

(2).脏读—读写场景

事务A正在对一条记录做修改,在事务A完成并提交前,这条记录的数据就处于不一致状态;这时事务B读取同一条记录,如果不加控制,事务B读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。【没提交的事务被其他事务读取】

(3).不可重复读—读写场景

一个事务内,首次读取某些数据后某个时间,再次读取数据,却发现其读取的数据已经发生了改变或删除,这种现象是“不可重复读”。

脏读和不可重复读区别:脏读读取了另一个事务未提交的修改;不可重复读读取的是另一个事务提交的修改。

(4).幻读—读写场景

一个事务按相同的范围查询条件重新读取以前检索过的数据,却发现其他事务变更了满足其查询条件的数据,两次的结果集不一样,这种现象就称为“幻读”。【其他事务进行了insert或delete操作】【一个事务内,两次不同时间的相同查询返回了不同的的结果集】

不可重复读和幻读区别:不可重复读是一个事务重复读取另一个事务的update或delete操作的提交信息;幻读是范围查询条件下,重复读取另一个事务insert操作引起的不一样结果集。

(5).幻读问题及解决

RU、RC隔离级别,基于“范围查询”或“非唯一索引”的条件操作,会产生幻读【这种隔离级别只能是record lock锁住一行,不锁间隙】。
RC隔离级别虽然也支持MVCC。但每次读取时会重新生成一个read view快照,所以也是无法避免幻读。
RR隔离级别,当前读通过next-key 锁来实现锁住记录本身和一个范围,进而避免幻读。快照读【MVCC和undo log实现,MySQL 通过版本号来保证同一个事务里每次查询得到的结果集都是一致的】是没幻读一说。
如果一个事务中,快照读和当前读混合出现,导致的幻读就无法判断了。

RR隔离级别,是如何避免幻读?
在这里插入图片描述
考虑B+的连续性,插入的数据是按照顺序存放,所以在非聚簇索引的非唯一索引记录上和间隙处,分别加了X锁(记录锁)和gap锁。gap锁的目的是防止其他事务插入数据,X锁保证其他事务不能变更该记录数据,这样就可以杜绝同一个事务的第二次当前读,出现幻读。

1.2、事务的隔离特性

在这里插入图片描述

读未提交(Read Uncommitted):可以读取未提交的记录,会出现脏读,幻读,不可重复读,所有并发问题都可能遇到;
提交读(Read committed):事务中只能读取已提交的修改,不会出现脏读,但会有不可重复读和幻读;
可重复读(Repeatable Read):一个事务多次查询的数据结果是一致的。【可以避免幻读】
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。事务只能一个接着一个地执行,但不能并发执行。事务隔离级别最高。【在读取的每行上都加上锁,又叫基于锁的并发控制LBCC】

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBoy_W.W.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值