mysql事务

一.事务的概念

1.概念
  • 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
  • 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
2.作用

在某些场景中,未完成某个操作需要多个sql配合完成,事务能将多个sql语句打包成一个“整体”,这个“整体”在执行过程中能够做到要么全部sql都执行完,要么一条都不执行,避免因意外时操作停滞在尴尬的中间状态。

为方便理解,举个栗子:
现有一张银行账户表

  • 现在要将id为1的账户转账500给id为2的账户,在执行的过程中,数据库的变动也许是先1账户余额变为500,再修改2的余额为1000.
    在这里插入图片描述

  • 但试想一下,当程序执行完第一个操作后,执行第二个操作前,出现了严重问题(如断电,系统崩溃等等),导致数据为全部修改完,id1和id2的余额都变成了500,那数据库就乱套了~~~

  • 如使用事务,执行完第一个操作后出现异常而无法执行下一条操作,将进行回滚操作,将上条操作撤销,使数据还原。

二.事务的特性

1)原子性:原子性是事务最重要的特性,指的是事务中各项操作在一次执行过程中,只允许存在两种状态,要么都成功,要么都失败。
在执行操作时,任何一项操作都会进行回滚操作,只有都执行成功,整个事务才算完成。

2)一致性:指的是事务在执行前和执行后,数据库中的数据都是‘合法状态’,不会出现非法的临时结果和中间状态。(类似于银行每日的对账,票据与余额对的上)

3)持久性:事务执行完毕后,就会修改硬盘上的数据,数据将吃就生效。

4)隔离性(重难点):隔离性描述了多个事务并发执行时,事务之间互不干扰。

三.事务的隔离性相关联的问题

1.脏读问题:一个事务读到另一个事务未提交的更新数据。
例子:有两个事务A和事务B并发执行,其中事务A在对某个表数据进行修改时,B也去读取这个数据,当B读完后,A又把数据改成了其他的。

这就导致B读到的数据不是最终的“正确数据”,而是读到了临时的‘脏数据’。
为解决此问题,我们可以规定,当A在修改时,B不可读取。也可以称为 “给写操作加锁”。

2.不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。(有点像彩礼坐地起价)

例子:有ABC三个事务,A修改完后B去读取,读取过程中又来个C对数据进行修改,此时B再次读取时与前一次读取的数据不一样,称为‘不可重复读’。

为解决此问题,应当规定在读取数据的过程不可修改数据库内容,称为“给读操作加锁”

**3.幻读问题:**相当于不可重复读的“特殊情况”,指同一个事务内多次查询返回的结果集不一样。
例子:事务A在读取数据,读的过程中,另一个事务新增或减少了一些其他的数据,在A的视角看来,多次读取的数据内容虽然一样,但是出现的“结果集”不一样。

为解决此问题,我们应规定,只要有事务在读数据,就不要对该数据范围进行任何操作,也称“串行化”。

四.MySQL四种隔离级别

1)read uncommitted:这种级别下,一个事务可以读取到另一个事务未提交的数据。
可能产生脏读,不可重复读,幻读问题。
但事务并发执行程度最高,执行速度最快。

2)read committed:这种级别下,一个事务只能读取到另一个事务提交之后的数据(给写操作加锁)。
可能产生不可重复读,幻读问题。
此时,并发程度降低,执行速度变慢,事务之间的隔离性提高了。

3)repeatable read:相当于给写操作与读操作都加锁了。
可能产生幻读问题,解决了脏读和不可重复读问题。
并发程度进一步降低,执行速度进一步变慢,事务间的隔离性提高。

4)serializable:串行化,所有事务在服务器上都是一个接一个执行的。
解决了脏读,不可重复读,幻读问题。
并发程度最低,执行速度最慢,隔离性最高,数据最为准确。

由此来看,准确性与执行速度为反比关系,我们要根据需求,选择不同的隔离级别。

以上为全部内容,如有不对,感谢指正!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值