回答mysql 10个问题

1.事务的概念是什么?

事务是对数据库中数据操作的保证数据逻辑一致的最小操作单位。

2.mysql的事务隔离级别读未提交, 读已提交, 可重复读, 串行各是什么意思?

读未提交:一个事务读取到了其他事务未提交的操作。
读已提交:一个事务读取到了其他事务已经提交的操作。
可重复读:一个事务从它开始到结束整个生命周期中,所能读取到的数据内容和它启动的时候所能读到的数据内容是相同的。不会出现在事务运行的整个过程中,不同的时间点读取到的数据不一样的情况。
串行化:所有的事务都进行排队执行,事务之间不存才并发的情况。读有读锁,写有写锁。读、读之间不影响,读、写和写、写之间互相排斥,当遇到排斥的情况后,后发生的事务需要等待先发生的事务执行完成后才可以执行。

3.读已提交, 可重复读是怎么通过视图构建实现的?

读已提交:会在事务中的每一个SQL语句执行的时候都为对应的SQL创建一个一致性视图。此时这个SQL能读取到已经提交的事务对数据的操作。
可重复读:会在事务启动的时候,为整个事务创建一个一致性视图,这个视图会贯穿到这个事务执行结束。在整个事务执行过程中,都使用这个视图中的数据作为一致性读的依据。

4.可重复读的使用场景举例?

对账的时候应该很有用
库管盘货

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

每一行数有多个版本,当我们要去读取数据的时候,要判断这个数据的版本号,对当前事务而言,是否可见,如果不可见,则要根据undolog计算得到上一个版本。如果上一个版本也不符合要求,则要找到再上一个版本,
直到找到对应正确的数据版本。

6.并发版本控制(MCVV)的概念是什么, 是怎么实现的?

同一个数据行,在数据库中存在多个版本号,这个版本号可以理解为当初操作这行数据的事务的事务ID。当多个事务在并发进行的时候,判断某个事务是否可以读取到某一行时,
会使用行的版本号,和当前事务的ID进行比较。如果发现比这个事务ID小,表示之前的事务提交的操作,对当前事务来说,此版本的数据可见。
如果发现这个数据的版本号比当前事务的ID大,则表示有未来发生的事务提交生成的,对当前事务来说,此版本的数据不可见。
如果发现这个竖行的版本号刚好等于某个正在运行的是事务ID,表示当前数据是由正运行的某个事务提交生成的,对当前事务来说,此版本数据不可见。
如果当前事务自己修改的数据,当前事务还是可以看到的。

7.使用长事务的弊病? 为什么使用常事务可能拖垮整个库?

长事务导致表空间持续增长,即便是事务提交或者回滚后,回滚表空间被是否后,表空间大小仍然不会被缩小。
长事务的存在导致锁发生冲突或等待的几率大大增加。
如果某个应用有发生锁等待后尝试重新建立连接的机制,那么在发生锁等待或冲突的时候,应用就会不断地发起新的连接,导致MySQL的连接数被占用爆满。MySQL不能在提供连接服务,就挂掉了。

8.事务的启动方式有哪几种?

begin;–一致性读的视图不会马上创建,而是在执行begin后面的第一个操作innodb表的SQL语句时生成。这个SQL可以是select,update,delete,insert。事务ID也是此时被分配的
start transaction;–和begin的功能效果一样。
start transaciton with consistent snapshot;–该语句执行后,会马上创建一致性读的视图。这个是它和begin的区别。事务ID也是此时被分配的。

9.commit work and chain的语法是做什么用的?

提交上一个事务,并且再开启一个新的事务。它的功能等效于:commit + begin。

10.怎么查询各个表中的长事务?

select * from information_schema.innodb_trx;
这个表中记录了所有正在运行的事务信息,里面有事务的开始时间。可以从这里看出哪些事务运行的时间比较长。

11.如何避免长事务的出现?

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值