MySQL(InnoDB剖析):---锁之(锁问题:脏读(未提交读)、不可重复读(提交读)、可重复读、丢失更新(可串行化))

本文详细介绍了MySQL中的四种事务隔离级别:脏读、不可重复读、可重复读以及丢失更新,通过实例分析了各自的特点和问题。脏读允许读取未提交数据;不可重复读则读取到已提交的数据,可能导致幻读问题;可重复读通过Next-Key Lock避免幻读,但仍存在幻读问题;丢失更新在数据库层面不会发生,但在应用逻辑中需要注意避免。文章最后探讨了如何防止丢失更新,并提出通过事务串行化来确保数据一致性。
摘要由CSDN通过智能技术生成

一、脏读(未提交读)

脏读不是脏页

 

  • 脏页是指在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中的页和磁盘中的页的数据是不一致的,当然在刷新到磁盘之前,日志都已经被写入到了重做日志文件中
  • 脏数据是指事物对缓冲池中行记录的修改,并且修改过的记录还没有被提交(commit)
  • 对于脏页的读取,是非常正常的。脏页时因为数据库实例内存和磁盘的异步造成的,这并不影响数据的一致性(或者说两者最终回达到一致性,即当脏页都刷回到磁盘)。并且因为脏页的刷新时异步的,不影响数据库的可用性,因此可以带来性能的提高
  • 脏数据截然不同,脏数据是指未提交的数据,如果读到了脏数据,即一个事务可以读到另外一个事务中未提交的数据,则显然违反了数据库的隔离性
  • 脏读是指在不同的事务下,当前事务可以读到另外事务未提交的数据。脏读也称为未提交读
  • 脏读发生在隔离级别“READ UNCOMMITTED”下,而目前InnoDB默认的事务隔离级别为“READ REPEATABLE”。SQL Server默认为“READ COMMITTED”,Oracle同样也是“READ COMMITTED”
  • 脏读隔离看似毫无用处,但是在一些比较特殊的情况下还是可以将事务的隔离级别设为“READ UNCOMMITTED”。例如replication环境中的slave节点,并且在该slave上的查询并不需要特别精确的返回值

 

演示案例

  • 下面是一个脏读的演示过程,我们将一步一步的展现出这个过程

  • 建立一张表,只有一个字段a,然后向表中插入一条记录
  • create table t(
        a int not null
    )ENGINE=INNODB;
     
    insert into t select 1;
     
    select * from t;

  • 会话A将的隔离级别设置为“READ UNCOMMITTED”ÿ
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值