数据库之锁的概念和显示锁的使用

author author     2022-10-09     290

关键词:

1  概述

【为什么要锁】

当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制。

数据库是一个多用户使用的共享资源,比如一个用户表t_user,两个浏览器前面的人登录了同个一个账号,把电话号码改了。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。为了解决这个问题,加锁是一个非常重要的技术,对实现数据库并发控制是一个好的方案。简单说,当一个执行sql语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录集加锁,在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作。

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。下面举例说明并发操作带来的数据不一致性问题:

现有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额为 X -1写回数据库,这样就造成了实际卖出两张火车票而数据库中的记录却只少了一张。 产生这种情况的原因是因为两个事务读入同一数据并同时修改,其中一个事务提交的结果破坏了另一个事务提交的结果,导致其数据的修改被丢失,破坏了事务的隔离性。并发控制要解决的就是这类问题。

封锁、时间戳、乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

2  概念介绍

锁类型 :

读锁:共享锁,可被多个读操作共享;只能共享给读。

写锁:排它锁,独占锁;

锁粒度:

表锁:在表级别施加锁,并发性较低;表级锁的粒度大于行级锁

行锁:在行级别施加锁,并发性较高;维持锁状态的成本较大;

锁的粒度越小,可能会造成死锁的状态。如两行需要同时编辑的时候,互相需要等待另一行解锁,造成了死锁的情况。

锁策略:在锁粒度及数据安全性之间寻求一种平衡机制;使得并发机制正常,同时又能维持正常的锁状态。

存储引擎级别的锁:级别以及何时施加或释放锁由存储引擎自行决定;由引擎决定

MySQL Server:表级别,可自行决定,也允许显式请求;允许用户手动请求和施加锁,是表级别的。

锁类别:

显式锁:用户手动请求的锁;

隐式锁:存储引擎自行根据需要施加的锁;

3  显式锁的使用

(1) LOCK TABLES 

LOCK TABLES  tbl_name  read|write, tbl_name read|write, ...

UNLOCK TABLES #解开全部的锁,后面不跟表名

施加写锁,写锁是排他的,不允许别的线程读和写,自己施加锁是不受影响

 lock tables classlist write;

MariaDB [sunny]> lock tables classlist write;

Query OK, 0 rows affected (0.00 sec)

MariaDB [sunny]> select * from classlist; #此时是可以正常读写

Empty set (0.00 sec)

注意,此时当另一用户连接的时候(从另一终端登录该数据库),查看的时候,结果就出不来,处于锁住的状态。

MariaDB [sunny]> select * from classlist;

施加读锁后,别的进程可以看,但是不能插入数据,读锁对写锁排斥,解锁后才能正常

MariaDB [sunny]> lock tables classlist read;

Query OK, 0 rows affected (0.00 sec)

此时从另一终端登录插入数据时是处于锁住状态

MariaDB [sunny]> insert into classlist values ("sunny",1,"100");

(2) FLUSH TABLES:将内存中的数据同步到磁盘上,即刷写操作,但是这个同步过程可以施加锁,一旦施加锁的时候,即执行将对应的表同步,关闭,打开,并施加锁。一旦施加了锁,此时别的线程读操作不受影响,但是写操作将不能被执行,需要解锁后才能生效

FLUSH TABLES tbl_name,... [WITH READ LOCK];

UNLOCK TABLES;

锁住所有的表,注意,可以针对某张表进行上锁

MariaDB [sunny]> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

其他线程,解锁后才能够插入数据

MariaDB [sunny]> insert into classlist values ("tracy",2,"99");

Query OK, 1 row affected (1 min 5.58 sec)

(3) SELECT cluase #FOR UPDATE请求施加写锁,LOCK IN SHARE MODE施加读锁,一般不操作

[FOR UPDATE | LOCK IN SHARE MODE]

一般要操作的是手动解锁。但是可能会对已经在软件层的操作造成影响。

更多介绍建议参考链接:

数据库的锁机制:http://blog.csdn.net/lexang1/article/details/52248686

数据库为什么需要锁机制?有哪些锁机制?:https://www.cnblogs.com/fanp/p/4633453.html

计算机基础之锁的分类

参考技术A避免多个线程同时读写同一个数据而产生不可预料的后果,我们需要将各个线程对同一个数据的访问同步。所谓同步,既是指在一个线程访问数据未结束时,其他线程不得对同一个数据进行访问。同步的最常见方法是... 查看详情

java浅谈线程安全之锁(代码片段)

在java锁的知识中,我们首先要知道分布式锁和本地锁的概念。1、本地锁:在单进程的系统中,存在多个线程去同时操作某个共享变量时,就需要使用本地锁,最常用的关键字:synchronized2、分布式锁:... 查看详情

多线程环境下队列操作之锁的教训

之前一直在研究多线程环境下的编程方法,却很少实战体验,以至于我一提到多线程编程,我总是信心不足,又总是说不出到底哪里不明白。今天工程现场反馈了一个“老问题”,我一直担心的是DAServer的运行机制有什么我不明... 查看详情

数据库锁解析(代码片段)

...考1.锁的概念1.锁的定义锁主要用于多用户环境下,保证数据库完整性和一致性的技术。2.锁的解释当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存... 查看详情

数据库-锁的实践

...   锁的定义:锁主要用于多用户环境下,保证数据库完整性和一致性的技术。 &nb 查看详情

java中锁的概念/介绍

...自JDK8和Netty3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的... 查看详情

java架构之路(多线程)aqs之reetrantlock显示锁的使用和底层源码解读

锁的粗化和锁的消除  这个本来应该是在synchronized里面去说的,忘记了,不是很重要,但是需要知道有这么一个东西啦。  我们先来演示一下锁的粗化:StringBuffersb=newStringBuffer();publicvoidlockCoarseningMethod(){//jvm的优化,锁的粗... 查看详情

今天初步了解了informix的锁的概念

...oad的时候,碰到好几次“-134ISAMError:nomorelocks”,原来是数据库中的锁的数量不够所致,后来到/informix/etc/下修改onconfig文件,把LOCKS的值增加到20000(原来400),问题解决。但在网上还看到有人用事务 查看详情

乐观锁的概念

...的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“version”字段开实现读取数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据的版... 查看详情

锁的相关概念介绍(代码片段)

...可重入锁synchronized和ReentrantLock都属于可重入锁,当前加锁的程序调用了一个持有当前锁对象的子程序不会发生阻塞,代码如下publicsynchronizedvoidmethod2()System.out.println("method2");publicsynchronizedvoidmethod1()S 查看详情

锁的原理和使用场景,乐观锁悲观锁公平锁非公平锁,基于数据库rediszookeeper实现分布式锁的原理及代码实现(代码片段)

一、锁1.1什么是锁?在JAVA中是一个非常重要的概念,尤其是在当今的互联网时代,高并发的场景下,更是离不开锁。那么锁到底是什么呢?在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于... 查看详情

带有 pthread 和互斥锁的 OpenCV

】带有pthread和互斥锁的OpenCV【英文标题】:OpenCVwithpthreadsandmutexes【发布时间】:2014-12-0616:01:22【问题描述】:我编写了一个相当基本的C++程序,它使用OpenCV库来显示我拥有的IP摄像机的视频流。由于我以后想添加图像处理代码... 查看详情

平时不用面试又爱问系列之锁优化问题(代码片段)

前面我们提到了锁策略问题,那么锁又如何优化的呢?1.锁的实现原理既然要知道锁的优化问题,首先的知道锁的实现原理(以加锁为例):先通过原子操作,检查并更新(CAS完成)一块内存区域,如果修改成功... 查看详情

并发_002锁的概念

...线程来声明这个类的对象时将会被阻塞,直到拥有这个类锁的对象被销毁或者主动是否了类锁公平锁  多个线程在等待同一个锁时,必须按照申请锁的时间来一次获得锁非公平锁 多个线程获取锁的顺序并不是按照申请锁... 查看详情

16lock

...情况,分析阻塞源头。模拟环境分析锁的源头的过程oracle数据库的锁锁的兼容性系统夯住怎么办1,查到进程号,直接用操作系统杀死进程。2、使用oradebug3、sqlplus-prelim/assysdba4、gdblock锁的相关概念sga区叫共享全局区(系统共享区... 查看详情

并发编程--锁(代码片段)

...是根据看待并发同步的角度。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被Java的并发包所引入。悲观锁悲观锁认为对于同一个数据的并发操作一定是会发生修改的,采取加锁的形式,悲观地认为,不加锁的并发操... 查看详情

mysql进阶之锁

...算机中协调多个进程或线程并发访问资源的一种机制。在数据库中,除了传统的计算资源竞争之外,数据也是一种提供给许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决堆的一个问题... 查看详情

锁的概念及synchronized使用原理解析(代码片段)

...的原因和解决办法。接着这篇文章会接着讲解线程相关的锁的概念,包括什么是自旋锁,重量级锁、轻量级锁、公平锁、乐观锁等等;以及从底层分析java在堆中如何存储对象,并解析synchronized怎么锁住对象,... 查看详情