简述一下你对mysql事物的理解_面试官: 说说你对MYSQL事务的理解!

什么是事务?

数据库中的事务是指对数据库执行一批操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。

事务的几个特性(ACID)

原子性(Atomicity)

事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。

一致性(Consistency)

事务开始之前、执行中、执行完毕,这些时间点,多个人去观察事务操作的数据的时候,看到的数据都是一致的,比如在事务操作过程中,A连接看到的是100,那么B此时也去看的时候也是100,不会说AB看到的数据不一样,他们在某个时间点看到的数据是一致的。

隔离性(Isolation)

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability)

一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。

事务的并发问题

1、 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、 幻读:A事务正在对一些数据进行修改,但是此时B事务直接近来插入一条数据,导致A事务修改结束后发现有一条数据还未修改掉,就好像发生了幻觉一样,这就叫幻读。

4、 读已提交,从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读)。

5、 可重复读,一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。

事务的隔离级别:

读未提交:READ-UNCOMMITTED,这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用。

读已提交:READ-COMMITTED(Oracle默认隔离级别,项目中常用的隔离级别),本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。

可重复读:REPEATABLE-READ(MySql默认隔离级别,为什么默认的隔离级别都会选用read commited 原因有二:1.可重复读存在间隙锁会使死锁的概率增大,在可重复读隔离级别下,条件列未命中索引会锁表!而在读已提交隔离级别下,只锁行;2.在读已提交级用别下,主从复制用什么binlog格式:row格式,是基于行的复制!), 在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同一个事务同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象。

串行:SERIALIZABLE,读操作会隐式获取共享锁,可以保证不同事务间的互斥。

隔离级别

脏读

不可重复读

幻读

读数据一致性

READ-UNCOMMITTED

最低级别,只能保证不读取物理上损坏的数据

READ-COMMITTED

语句级

REPEATABLE-READ

事务级

SERIALIZABLE

最高级别,事务级

mysql binlog的格式三种:statement、row、mixed

statement:记录的是修改SQL语句 row:记录的是每行实际数据的变更 mixed:statement和row模式的混合 STATEMENT格式,它记录的顺序为先插后删! row格式,此时是基于行的复制

注意:在REPEATABLE-READ隔离级别下,条件列未命中索引会锁表!而在READ-COMMITTED隔离级别下用的binlog为row格式,是基于行的复制,只锁行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值