MySQL 事务手记

本文深入探讨了数据库事务的概念,包括其作用、ACID特性、并发执行时可能出现的问题及解决办法。详细阐述了事务的四种隔离级别及其对并发性能的影响,以及MySQL的默认隔离级别。还介绍了事务隔离如何通过read-view实现,以及MVCC的工作原理。最后,讨论了长事务的危害和避免策略,并展示了如何开启和管理事务。
摘要由CSDN通过智能技术生成

事务是什么?

是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务有什么作用?

保证事务执行整个过程中数据库操作的正确性(ACID)。

多事务同时执行的时候,可能会出现的问题?

脏读:读到其他事务未提交的内容

不可重复读:一个事务中两次相同sql得到的结果不一致

幻读:其他事务同时编辑表内容,当前事务处理结果会导致新编辑数据没有别处理到,产生幻读。

事务的四个特征?

A(原子性):事务不可分割,要么都成功要么失败

C(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

I(隔离性):据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

D(持久化):事务完成后,数据写入数据库

事务的隔离级别?

读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。
这4种隔离级别,并行性能依次降低,安全性依次提高

MySQL默认的事务隔离级别是?

可重复读-repeattable-read

怎么配置MySQL事务的隔离级别?

在my.cnf tx-isolation/transacton_isolation

事务是在MySQL那个模块执行?

存储引擎-只有innodb支持事务

事务隔离是怎么通过read-view(读视图)实现的?

每一行数据有多个版本(内容不一样,用于事务回滚),当我们读取数据时,要用当前事务id去对比版本中事务ID,寻这个版本链路找到自己可见的版本数据。

mvcc是什么?执行过程?

mvcc-多版本并发控制

执行过程:每行数据(多次操作)有多个事务版本(内容不一样,用于事务回滚),当多个并发事务要操作这个数据时,判断事务是否可以读取到目标行那个版本的数据时,需要用当前事务ID和目标行多个版本的事务ID对比,规则如下:

        目标行版本事务ID小于当前事务,可以读取。

        目标行版本事务ID大于当前事务,不可以读取。

        如果当前事务自己修改的数据,当前事务还是可以看到的

为什么不要使用长事务?

长事务导致表空间持续增长,即便是事务提交或者回滚后,表空间大小仍然不会被缩小。
长事务的存在导致锁发生冲突或等待的几率大大增加。

如何避免长事务?

从数据库方面:
    a.设置autocommit=1,不要设置为0。
    b.写脚本监控information_schemal.innodb_trx表中数据内容,发现长事务,kill掉它。
    c.配置SQL语句所能执行的最大运行时间,如果查过最大运行时间后,中断这个运行事情长的SQL语句。
    d.设置回滚表空单独存放,便于回收表空间。
从业务代码方面:
    a.确认是否使用了autocommit=0的配置,如果有关闭它,然后再业务代码中手动的使用begin;commit来操作。
    b.检查业务逻辑代码,能拆分为小事务的不要用大事务。
    c.检查代码,把没有必要的select语句被事务包裹的情况去掉。

怎么开启事务?

begin/start transaction

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值