锁问题

作者: lsh的学习笔记 | 来源:发表于2020-05-06 20:35 被阅读0次

锁会带来三种问题。

1. 脏读

在不同的事务下,当前事务可以读到另外事务未提交的数据。

示例
发生的条件

事务隔离级别为:Read uncommitted。

使用场景

主从复制环境中,slave节点可以设为Read uncommitted。

2. 不可重复读

在一个事务内多次读取同一数据集合。在这个事务还没有结束时,另外一个事务也访问该同一数据集合,并做了一些DML操作。因此,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据不一样的情况,这种情况称为不可重复读

示例
和脏读的区别

脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但是其违反了数据库事务一致性的要求。

一般来说,不可重复读的问题是可以接受的,因为其读到的是已经提交的数据,本身并不会带来很大的问题。因此,很多数据库厂商(如Oracle、MicrosoftSQLServer)将其数据库事务的默认隔离级别设置为READCOMMITTED,在这种隔离级别下允许不可重复读的现象

3. 丢失更新

一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。

要避免丢失更新发生,需要让事务在这种情况下的操作变成串行化,而不是并行的操作。

即对用户读取的记录加上一个排他X锁,注意这需要在同一个事务中,然后再更新,提交事务之后,才会释放排他锁。

处理方法

举例:

begin;
-- 查询的时候,在后面加上 for update,即加排他锁;
select * from account where id = 10 for update;

-- update
update account set balance = 30000 where id = 10;
commit;

相关文章

  • 锁问题

    锁会带来三种问题。 1. 脏读 在不同的事务下,当前事务可以读到另外事务未提交的数据。 发生的条件 事务隔离级别为...

  • 并发编程基础与原理

    Synchronized(同步锁) 思考一个问题,锁是为了解决什么问题,锁的本质是什么?  锁的本质是在多线程使用...

  • 数据库相关问题与解答

    收集常见数据库问题 锁机制介绍:行锁、表锁、排他锁、共享锁,悲观锁、乐观锁。行级锁:开销大,加锁慢;会出现死锁;锁...

  • 细谈CAS与ABA

    题目:如何实现乐观锁(CAS),如何避免ABA问题? 这个题主要考查原子操作、悲观锁、乐观锁及ABA问题。 原子操...

  • MySql锁问题

    一、InnoDB存储引擎的锁算法 1、Record lock 单个行记录上的锁,record locks 总是锁定...

  • MySQL 锁问题

    MyISAM 和 MEMORY 存储引擎采用的是表级锁;InnoDB 存储引擎即支持行级锁,也支持表级锁,但默认情...

  • InnoDB锁问题

    介绍 InnoDB本身遵守DML操作的ACID模型,所以InnoDB本身支持事务。并且InnoDB也支持多种粒度的...

  • es总结和思考2

    ES如何处理并发问题 其实这个问题问的是悲观锁和乐观锁,以及在ES中的应用 悲观锁 悲观锁就是只要操作就加锁(不太...

  • 使用JVM提高秒杀系统性能

    前提 使用redis分布式锁,解决秒杀系统库存为零 继续扣减问题 redis分布式锁出现的问题 使用redis锁,...

  • Curator 使用(四) 分布式锁实现排它锁

    Zookeeper实现分布式锁总结 优点: 有效的解决单点问题,不可重入问题,非阻塞问题以及锁无法释放的问题 实现...

网友评论

      本文标题:锁问题

      本文链接:https://www.haomeiwen.com/subject/prjgghtx.html