京东c1司机面试流程视频,京东c1司机面试流程及答案?

MySQL中的事务(Transaction)是由存储引擎实现的,在MySQL中只有InnoDB存储引擎才支持事务。

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

1. 事务的四个特性(ACID)

京东c1司机面试流程视频,京东c1司机面试流程及答案?

原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况;

一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态;

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

持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。

面试题:mysql事务的四种特性到底是基于什么机制实现呢?(字节面试题)

事务的隔离性由锁机制实现。

而事务的原子性、一致性和持久性由事务的 redo 日志和 undo 日志来保证。

REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。

UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

redo log:是存储引擎层 (innodb) 生成的日志,记录的是物理级别上的页修改操作;

undo log:是存储引擎层 (innodb) 生成的日志,记录的是逻辑操作日志;主要用于事务的回滚(undo log 记录的是每个修改操作的逆操作)和一致性非锁定读(undo log 回滚行记录到某种特定的版本—MVCC,即多版本并发控制)。

2. 当多个客户端并发地访问同一个表时,可能出现以下的一致性问题

(1)脏读: 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

(2)不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,

那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

(3)幻读: 一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。

那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

(4)丢失更新: 两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

3. MySQL事务支持如下四种隔离,用以控制事务所做的修改,并将修改通告至其它并发的事务:

京东c1司机面试流程视频,京东c1司机面试流程及答案?

(1)未提交读(Read Uncommitted(RU)):允许脏读,即允许一个事务可以看到其他事务未提交的修改。

(2)提交读(Read Committed(RC)):允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。防止脏读。

(3)可重复读(Repeatable Read(RR)):—mysql默认的隔离级别确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。

可以防止脏读和不可重复读

(4)串行读(Serializable):—相当于锁表完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阻塞。可以防止脏读,不可重复读取和幻读,

(事务串行化)会降低数据库的效率。

面试题:mysql默认的隔离级别是什么?如何保证的 (京东面试题)

面试题:解释下什么是快照读和当前读,举例说下。(京东面试题)

4. MVCC多版本并发控制

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC就是为了实现读-写冲突(快找读和数据库的当前读冲突)不加锁,提升数据库性能设计的。

快照读:

读取的是记录数据的可见版本(有旧的版本),不加锁,普通的select语句都是快照读,如:

select * from account where id>2;

当前读:

读取的是记录数据的最新版本,显示加锁的都是当前读

select * from account where id>2 lock in share mode;

select * from account where id>2 for update;

MVCC的实现依赖

MVCC的实现原理主要是依赖mysql每条记录中的 3个默认字段(DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID),和Read View(读视图)以及 undo日志来实现的。

在InnoDB中,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的删除时间。存储的时间值实际是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。在可重复读隔离级别下,MVCC的具体操作如下:

SELECT:

a. 只查询版本早于当前事务版本的数据行。

b. 行的删除版本要么 未定义,要么大于当前事务的版本号。这可以确保事务读取到的行,在事务开始之前未被删除。

INSERT:

InnoDB为新插入的每一行保存当前系统版本号作为行版本号。

DELETE:

? InnoDB为删除的每一行保存当前系统版本号作为行删除标识。

UPDATE:

? InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

每天进步一点,早日拿到心仪offer。[点亮平安灯]

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.vsaren.org/29440.html