1、隔离级别

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

 

2、对应出现的问题:

sql事务

1 脏读

脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。

2 不可重复读:

是指事务中,两次查询的结果不一致,原因,在查询的过程中,其他事务做了更新的操作

 

3 幻读:

幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。

幻读的重点在于新增或者删除 (数据条数变化)。同样的条件, 第1次和第2次读出来的记录数不一样

例子:

目前工资为1000的员工有10人。 
事务1,读取所有工资为1000的员工。 

con1 = getConnection();  
Select * from employee where salary =1000;  
共读取10条记录 

这时另一个事务向employee表插入了一条员工记录,工资也为1000 

con2 = getConnection();  
Insert into employee(empId,salary) values("Lili",1000);  
con2.commit();  
事务1再次读取所有工资为1000的员工 

select * from employee where salary =1000;  
共读取到了11条记录,这就像产生了幻读。

虽然理论上说3. Repeatable Read(重复读)隔离级别在mysql中可能引起幻读的问题,但是mysql InnoDB存储引擎和XtraDB存储引擎通过多版本并发控制技术已经帮我们使用者解决了可能存在的幻读问题。意即,mysql如果用InnoDB或者XtraDB存储引擎并设置隔离级别为Repeatable Read也不会存在幻读问题,也就是效果和可串行化一样,但是效率比可串行化高的多。我猜这也是为什么mysql默认隔离级别为Repeatable Read的原因。

相关文章:

  • 2021-08-14
  • 2022-01-13
  • 2021-05-24
猜你喜欢
  • 2021-06-06
  • 2021-06-04
  • 2022-02-02
  • 2022-03-03
  • 2022-02-02
相关资源
相似解决方案