数据库加锁

  • 概述

     锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理。在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数据的一致性,就需要数据库的锁机制。每种数据库的锁机制都自己的实现方式,mysql作为一款工作中经常遇到的数据库,它的锁机制在面试中也经常会被问到。所以本文针对mysql数据库,对其锁机制进行总结。
    

mysql的锁可以分为服务层实现的锁,例如Lock Tables、全局读锁、命名锁、字符锁,或者存储引擎的锁,例如行级锁。InnoDB作为MySQL中最为常见的存储引擎,本文默认MySQL选择InnoDB作为存储引擎。
锁的分类按照特性有多种分类,常见的比如显式锁和隐式锁;表锁和行锁;共享锁和排他锁;乐观锁和悲观锁等等。

服务级别锁

表锁
 表锁可以是显式也可以是隐式的。显示的锁用Lock Table来创建,但要记得Lock Table之后进行操作,需要在操作结束后,使用UnLock来释放锁。Lock Tables有read和write两种,Lock Tables…Read通常被称为共享锁或者读锁,读锁或者共享锁,是互相不阻塞的,多个用户可以同一时间使用共享锁互相不阻塞。Lock Table…write通常被称为排他锁或者写锁,写锁或者排他锁会阻塞其他的读锁或者写锁,确保在给定时间里,只有一个用户执行写入,防止其他用户读取正在写入的同一资源。

  1. Lock Tables…READ不会阻塞其他线程对表数据的读取,会阻塞其他线程对数据变更
  2. Lock Tables…WRITE会阻塞其他线程对数据读和写
  3. Lock Tables…READ不允许对表进行更新操作(新增、删除也不行),并且不允许访问未被锁住的表
  4. Lock Tables…WRITE允许对被锁住的表进行增删改查,但不允许对其他表进行访问
IInnoDB锁

乐观锁和悲观锁

  • 悲观锁:指悲观的认为,需要访问的数据随时可能被其他人访问或者修改。因此在访问数据之前,对要访问的数据加锁,不允许其他其他人对数据进行访问或者修改。上述讲到的服务器锁和InnoDB锁都属于悲观锁。
  • 乐观锁:指乐观的认为要访问的数据不会被人修改。因此不对数据进行加锁,如果操作的时候发现已经失败了,则重新获取数据进行更新(如CAS),或者直接返回操作失败。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Oracle 数据库中,加锁和解是管理并发访问的重要操作。加锁用于确保对数据库对象的独占访问,防止其他会话对其进行更改,而解则释放对对象的控制。下面是关于 Oracle 数据库加锁和解的一些重要信息: 1. 加锁类型: - 共享(Shared Lock):允许其他会话读取但不允许修改被定对象。 - 排他(Exclusive Lock):阻止其他会话读取或修改被定对象。 2. 使用的语句: - 加锁:可以使用 `LOCK TABLE` 语句对表进行加锁,也可以在事务中使用 `SELECT ... FOR UPDATE` 或 `SELECT ... FOR UPDATE NOWAIT` 语句来对选定的行进行加锁。 - 解:在事务完成后,或者通过 `COMMIT` 或 `ROLLBACK` 结束事务时,会自动释放由事务持有的所有。 3. 隐式和显式: - 隐式:当执行数据操作语句(如 `INSERT`、`UPDATE` 或 `DELETE`)时,Oracle 会自动为涉及的数据行加上相应的隐式。 - 显式:通过使用 `FOR UPDATE` 和 `FOR UPDATE NOWAIT` 语句,可以显式地对选定的数据行进行加锁。 4. 死: - 死是指两个或多个会话相互等待对方所持有的资源,导致无法继续进行。Oracle 使用死检测机制自动解决死问题。 需要注意的是,正确使用数据库的性能和并发访问非常重要。滥用可能会导致性能下降或死情况的发生。因此,在设计数据库应用程序时,需要仔细考虑的使用方式和范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值