Java部分:
MySQL部分:
1、什么是脏读、幻读、不可重复读
脏读指的是一个事务(T1),读取到了第二个事务(T2)未提交的数据
不可重复读指的是一个事务(T1),读取完数据之后处理其他事情,但是在T1事务结束之前,第二个事务(T2)对数据进行了修改
,导致T1事务无法再读取原始数据
幻读和不可重复读有点类似,一个事务(T1),读取完数据之后处理其他的事情,但是在T1事务结束之前,第二个事务(T2)对数据进行了插入
或删除
,导致T1无法读取原始数据
区别
脏读读取的是未提交的数据,而不可重复读读取的是已经提交的数据
不可重复读读取的是修改
的数据,而幻读读取的是插入
或删除
的数据。
如何避免这三种情况
幻读和不可重复读只需要将满足条件的行进行锁定,脏读的话需要对表进行锁定。
事务的隔离级别是怎样的
在MySQL中事务的隔离级别有四种,如下图所示(这四种在面试过程中经常问到,但是在实际开发过程中并不需要调整)
从上到下,事务隔离级别由低到高,并发量和数据吞吐量由高到低
1、READ UNCOMMITTED可读未提交,这种隔离级别是最低的隔离级别,但是对于高并发和数据吞吐量是最高的,可读未提交可以直接造成脏读,可能会引发不可重复读和幻读,
2、READ COMMITTED可读已提交,这种隔离级别高于可读未提交,这种事务隔离级别读取的是已经提交的数据,可能会造成幻读和不可重复读
3、REPEATABLE READ可重复读(MySQL默认的事务隔离级别
),不会造成不可重复读,但是除了Innodb引擎以外的其他引擎可能会造成幻读的情况
4、SERIALIZABLE可串行读,这种事务的隔离级别是最高的,但是并发和吞吐量是最低的,不会造成脏读、幻读、不可重复读,但是会造成锁表的情况,即当一个事务(T1)在对加锁读的表操作时,其他事务无法进行操作,只能等T1事务结束后去操作
如何操作事务的隔离级别
获取当前的事务隔离级别
> SHOW VARIABLES LIKE 'transaction_isolation'; #默认显示的应该是REPEATABLE-READ
设置事务隔离级别,以设置为可读未提交 READ UNCOMMITTED
> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
但是现在并不会对事务的隔离级别进行操作,因为在MySQL5.1之后默认的事务隔离级别就是REPEATABLE READ,而存储引擎就是InnoDB因此,MySQL默认REPEATABLE READ也可以解决幻读的问题
标签:...,事务,读取,隔离,幻读,T1,面试,级别,随记 From: https://www.cnblogs.com/porterdong/p/16662587.html