精华内容
下载资源
问答
  • 数据库锁机制
    千次阅读
    2022-05-30 18:22:06


    前言

    本文介绍数据库的锁机制,包括共享锁、更新锁、排他锁、行锁和表锁。


    一、数据库的共享锁、更新锁、排他锁

    引入锁机制,主要是为了应对并发的情况,保证数据的一致性和完整性

    (1)MySQL数据库有哪些锁?

    1.共享锁

    • 读锁,如果一个用户要去读一个数据,可以加上共享锁,这样其他用户就不能对该数据进行写操作,只有用户读完数据,释放读锁,其他用户才可以进行写操作;

    • 可以同时有多个共享锁。

    2.更新锁

    • U锁,对一个数据上更新锁,说明过一会就要对这个数据进行写操作(更新锁升级为排他锁);

    • U锁可以解决部分由共享锁和排他锁导致的死锁问题;

    • U锁与共享锁是兼容的,U锁和其他U锁和排他锁是不兼容的

    3.排他锁

    • 写锁,X锁,对数据进行修改的时候,加上写锁,此时数据不允许读和写,不允许访问;

    • 写锁和共享锁、更新锁都是不兼容的。

    (2)什么是死锁?

    举个例子:

    事务a对资源1先读,后写,事务b对资源1先读,后写,二者同时读,就会发生死锁。

    同时读,a和b分别对资源1加共享锁,此时,a想要写,需要把共享锁升级为排他锁,但是排他锁和共享锁不兼容(和b的共享锁),因此需要等待b释放共享锁,a才能升级为排他锁进行数据的修改,同理,b想要修改数据,需要升级排他锁,而也需要等待a去释放,二者相互等待,发生死锁。

    (3)怎么解决死锁?

    1.对于上面的这种情况,可以使用U锁去解决

    a和b先分别对资源1进行上共享锁,不冲突,b呢,把共享锁变为更新锁,表示自己一会要更改数据,更新锁和a的共享锁不冲突,接下来,根据更新锁的特性,由更新锁升级为排他锁,此时无视排他锁和共享锁的互斥,这样b就可以加排他锁,修改数据,修改之后释放全部锁,a再升级排他锁进行修改,解决了死锁问题

    2.使用悲观锁

    3.使用乐观锁

    (4)怎么避免死锁?

    1.尽量按照顺序进行加锁和释放锁,避免冲突;

    2.大的事务容易出现死锁,尽量把大的事务转化为小事务;

    3.适当降低隔离级别;

    4.使用合适的索引。

    二、数据库的行锁和表锁

    (1)概述

    • 数据库的锁总体分为悲观锁和乐观锁,悲观锁按照范围可以分为行锁和表锁,行锁根据算法不同还可以往下分。

    • 行锁和表锁是为了解决数据一致性的问题的

    (2)行锁

    • 当更新数据的时候,可以加个行锁;

    • 行锁是指对一行或者多行数据加锁,加锁后,其他用户不能访问该行,可以访问其他行;

    • 行锁用到了索引,根据索引进行查找指定行;

    • 并发高,冲突多,可以引起死锁。

    (3)表锁

    • 当插入数据的时候,可以用表锁锁住整个表;

    • 表锁是全局扫描,不是根据检索来的;

    • 表锁对整个表加锁,其他用户不允许访问该表任何一行;

    • 并发少,冲突少。

    总结

    本文简单的介绍了一下数据库的锁机制,希望对大家有所帮助。

    本系列为基础知识分享,日更,有任何问题可以私聊或评论博主哦!
    希望给各位找工作和工作中的小伙伴提供一点微博的帮助,如果觉得有帮助,欢迎点赞评论收藏关注~

    更多相关内容
  • 数据库锁机制

    千次阅读 2022-04-04 15:31:30
    这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。 锁是计算机协调多个进程或线程并发访问...

    目录

    1、表锁和行锁

    2、间隙锁(Gap Lock)和临键锁(Next-key Locks)

    3、锁机制分析


    数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。

    是计算机协调多个进程或线程并发访问某一资源的机制

    在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

    1、表锁和行锁

    (1)从性能上分为乐观锁(用版本对比来实现)和悲观锁

    (2)从对数据库操作的类型分,分为读锁写锁(都属于悲观锁)

    读锁(共享锁,S锁(Shared)):针对同一份数据,多个读操作可以同时进行而不会互相影响

    写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁

    (3)从对数据操作的粒度分,分为表锁行锁

    表锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

    行锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

    表锁案例分析

    --建表SQL
    CREATE TABLE `mylock` (
    	`id` INT (11) NOT NULL AUTO_INCREMENT,
    	`NAME` VARCHAR (20) DEFAULT NULL,
    	PRIMARY KEY (`id`)
    ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
    
    --插入数据
    INSERT INTO mylock (`id`, `NAME`) VALUES ('1', 'a');
    INSERT INTO mylock (`id`, `NAME`) VALUES ('2', 'b');
    INSERT INTO mylock (`id`, `NAME`) VALUES ('3', 'c');
    INSERT INTO mylock (`id`, `NAME`) VALUES ('4', 'd');

    操作命令

    --手动增加表锁
    lock table 表名称 read(write),表名称2 read(write);
    
    --查看表上加过的锁
    show open tables;
    
    --删除表锁
    unlock tables;

    加读锁:当前session和其他session都可以读该表,当前session中插入或者更新锁定的表都会报错,其他session插入或更新则会等待。

    加写锁:当前session对该表的增删改查都没有问题,其他session对该表的所有操作被阻塞。

    案例结论

    1、对MyISAM表的读操作(加读锁) ,不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。

    2、对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

    行锁案例分析

    InnoDB与MYISAM的最大不同有两点:

    (1)InnoDB支持事务(TRANSACTION),(2)InnoDB支持行级锁

    --建表
    CREATE TABLE `account` (
      `id` INT (11) NOT NULL AUTO_INCREMENT,
    	`name` varchar(255) DEFAULT NULL,
    	`balance` int(11) DEFAULT NULL,
    	PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    --插入数据
    INSERT INTO `account` (`name`, `balance`) VALUES ('mike', '500');
    INSERT INTO `account` (`name`, `balance`) VALUES ('bob', '500');
    INSERT INTO `account` (`name`, `balance`) VALUES ('lucy', '500');

    行锁效果:一个session开启事务更新不提交,另一个session更新同一条记录会阻塞,更新不同记录不会阻塞

    总结:

    MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。

    InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。

    简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。

    2、间隙锁(Gap Lock)和临键锁(Next-key Locks)

    间隙锁,锁的就是两个值之间的空隙。Mysql默认级别是repeatable-read(可重复读),间隙锁在某些情况下可以解决幻读问题。

    如果account表里数据如下:

    那么间隙就有 id 为 (3,7),(7,16),(16,正无穷) 这三个区间。

    范围修改:如果在Session_1下面执行

    --范围修改
    update account set name = 'xiaoming' where id > 5 and id < 11;

    那么其他Session没法新增或修改id在(3,16]区间的任何一行数据,注意最后那个16也是包含在内的。

    间隙锁是在可重复读隔离级别下才会生效。

    临键锁(Next-key Locks)

    Next-Key Locks是行锁与间隙锁的组合。像上面那个例子里的这个(3,20]的整个区间可以叫做临键锁。

    3、锁机制分析

    (1)无索引行锁会升级为表锁(RR级别会升级为表锁,RC级别不会升级为表锁)

    锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁。

    InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。

    锁定某一行还可以用 lock in share mode (共享锁) 和 for update(排它锁),例如:

    select * from account where id = 1 for update;

    结论:Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比就会有比较明显的优势了。

    但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

    (2)行锁分析

    通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况

    show status like 'innodb_row_lock%';

    对各个状态量的说明如下:

    • Innodb_row_lock_current_waits: 当前正在等待锁定的数量
    • Innodb_row_lock_time: 从系统启动到现在锁定总时间长度(等待总时长)
    • Innodb_row_lock_time_avg: 每次等待所花平均时间(等待平均时长)
    • Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间
    • Innodb_row_lock_waits: 系统启动后到现在总共等待的次数(等待总次数)

    当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化计划。

    (3)查看INFORMATION_SCHEMA系统库锁相关数据表

    -- 查看事务
    select * from INFORMATION_SCHEMA.INNODB_TRX;
    
    -- 查看锁
    select * from INFORMATION_SCHEMA.INNODB_LOCKS;
    
    -- 查看锁等待
    select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
    
    -- 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
    kill trx_mysql_thread_id
    
    -- 查看锁等待详细信息
    show engine innodb status\G; 

    (4)锁优化建议

    • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
    • 合理设计索引,尽量缩小锁的范围
    • 尽可能减少检索条件范围,避免间隙锁
    • 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
    • 尽可能低级别事务隔离
    展开全文
  • 详解数据库锁机制和原理

    千次阅读 2020-07-13 15:55:10
    本文将基于 MySQL,介绍数据库锁机制,相信大家耐心看了之后肯定有收获,码字不易,别忘了「在看」,「转发」哦。 锁的类型 MyISAM 锁机制 InnoDB 锁机制 正文 01 锁的类型 从对数据的操作粒度来划分,MySQL 大致可...

    开足码力,码动人生,微信搜索【 程序员大帝 】,关注这个一言不合就开车的的代码界老司机
    本文 GitHub上已经收录 https://github.com/BeKingCoding/JavaKing , 一线大厂面试核心知识点、我的联系方式和技术交流群,欢迎Star和完善

    前言

    在座的朋友们,你们的时间够用吗?想要成为一个成功的人吗?如果你们都有这样的疑惑,那就保持一刻谦虚的心态,跟着罗老师学习时间管理吧!

    在这里插入图片描述

    毕竟时间管理大师是一个用户访问多个资源,今天咱们来讲讲当多个用户并发访问同一个资源时的情况

    在数据库中,如果多个事务同时对一个数据进行操作,并发的操作若不加控制,可能会读取和存储不正确的数据,破坏数据库的一致性、脏读、不可重复读、幻读等、甚至可能产生死锁。

    为了解决这个问题,加锁是一个非常重要的技术,对实现数据库并发控制是一个好的方案。

    简单说,当一个执行 sql 语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录加锁,在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作。

    本文将基于 MySQL,介绍数据库锁机制,相信大家耐心看了之后肯定有收获,码字不易,别忘了「在看」,「转发」哦。

    • 锁的类型
    • MyISAM 锁机制
    • InnoDB 锁机制

    正文

    01 锁的类型

    从对数据的操作粒度来划分,MySQL 大致可归纳为 3 种锁。

    • 表级锁

    表级别的锁定是 MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。

    所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。

    当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发大度大打折扣。

    • 行级锁

    行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。

    由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。

    虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。

    • 页级锁

    页面锁会去锁定一页的数据,我们知道 MySQL 的索引本身是由 B+ 树实现的。

    每个叶子节点的单位页,叶子节点上面存放了多个记录行,数据存储是按照一页一页来的,每次锁定一页的数据,其实就是相邻的数据,开销和加锁时间界于表锁和行锁之间。

    页级锁也会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

    02 MyISAM锁机制

    MyISAM引擎只提供表锁。

    在执行查询语句( SELECT )前,会自动给涉及的表加读锁,此时允许其他用户对同一表的读操作。但会阻塞对同一个表的写操作。

    在执行更新操作( UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,此时会阻塞其他用户对同一个表的读操作和写操作。

    03 InnoDB锁机制

    InnoDB 支持表锁、行锁,实际上InnoDB 是通过给索引项加锁,来实现行锁的。

    只有查询数据时,检索条件走索引才可以使用行级锁,否则 InnoDB 将使用表锁。

    在实际开发中,要特别注意 InnoDB 这一特性,不然,可能造成大量的锁冲突,从而影响并发!!!

    InnoDB使用索引的条件

    (1)在不通过索引条件查询的时候,InnoDB 确实使用的是表锁,而不是行锁。

    (2)行锁是针对索引加锁,不是针对记录加的锁。即使访问的是不同行,但如果它们索引相同,还是会出现锁冲突。

    (3)当表中含有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行。

    (4)即使在条件中使用了索引,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价决定的。如果 MySQL 认为全表扫描效率更高,比如很小的表,也不会使用索引,此时 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突的时候,不要忘记检查 SQL 的执行计划,以确定是否真正使用了索引。

    在默认的可重复读隔离级别下:

    执行查询语句( SELECT )前,由于 MVCC(多版本控制)的方式,什么锁都不会加。

    在执行更新操作( UPDATE、DELETE、INSERT 等)前,会自动给涉及的行加写锁,此时会阻塞其他用户的写操作,但是通过 MVCC(多版本控制)的方式允许读操作。

    04 总结

    通过这篇文章,基于MySQL,为大家介绍了数据库的锁机制。针对不同情况,什么时候使用锁,锁到底生不生效是大家需要关注的问题。


    Offer收割机》系列持续更新,也会定期分享互联网常用技术栈相关的文章,GitHub 上已经收录 https://github.com/BeKingCoding/JavaKing ,讲解一线大厂面试要求的核心知识点、并有对标阿里P7级别的成长体系脑图,欢迎加入技术交流群,我们一起有点东西。


    在这里插入图片描述


    我是一言不合就开车的代码界老司机无忌。创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
    在这里插入图片描述

    展开全文
  • DB2数据库锁机制及问题
  • 在并发访问情况下,很有可能出现不可重复读等等读现象。为了更好的应对高并发,封锁...乐观和悲观不仅在关系数据库里应用,在Hibernate、Memcache等等也有相关概念。 悲观:也即悲观并发控制,Pessimistic Concur
  • 数据库 锁机制

    千次阅读 2019-02-23 09:45:13
    S一般用于表级,事务T对数据对象A加上S,则事务T可以读A但是不能修改它,而在T释放S之前,其他事务只能对A再加S,而不能再加X,这就保证了在事务T释放A上的共享之前,获取的其他事务只能对A读而不能...

    并发控制容易导致活锁和死锁。
    加锁主要是防止不可重复和读脏数据以及。

    共享锁(S锁)

    Share Lock
    S锁一般用于表级,事务T对数据对象A加上S锁,则事务T可以读A但是不能修改它,而在T释放S锁之前,其他事务只能对A再加S锁,而不能再加X锁,这就保证了在事务T释放A上的共享锁之前,获取锁的其他事务只能对A读而不能进行其他修改。通常A被读取完毕,S锁立即释放。

    排它锁(X锁)

    Exclusive Lock
    X锁是行级锁,事务T对数据对象A加上X锁,则T对A既可读又可写,此时其他事务不能对A加其他锁。获取锁的其他事务对A既可读又可写。X锁要直到事务结束时才会释放。

    更新锁(U锁)

    Update lock
    一次只有一个事务能获取数据对象A 的U锁,它允许其他事务读取,但其他事务不能再加U锁和X锁,当资源被更新时,U锁升级到X锁,U锁直到事务完成才会被释放。

    https://blog.csdn.net/C_J33/article/details/79487941
    借鉴了该博客的图。
    锁的分类

    悲观锁(Pessimistic Lock)

    悲观锁则是采用数据库提供的锁机制。这会导致数据库性能的开销大大增加。具有强烈的独占性和排他性。

    乐观锁(Optimistic Lock)

    乐观锁一般是由程序员实现,一般采用版本号和时间戳的方法。假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回错误的信息,乐观锁开销较小。

    展开全文
  • 理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf
  • DB数据库锁机制及问题PPT课件.pptx
  • DB数据库锁机制及问题PPT学习教案.pptx
  • 数据库锁机制(一)

    万次阅读 多人点赞 2019-03-29 02:21:37
    数据库锁机制做了以下总结: 乐观锁 乐观锁就如同他的名字一样,当其他人(线程)去取数据的时候,总是认为别人不会修改数据,总不会发生并发问题,所以因此没有上锁,只有在线程提交数据时会通过检查版本号的...
  • sqlite锁机制研究 sqlite 事务 sqlite锁与事务是紧密联系的,在探究锁之前先要了解一下sqlite事务。sqlite事务定义了一组SQL命令,这组命令会作为一个整体被全部执行。事务用begin开启,用commit提交,用rollback...
  • 锁机制数据库一个比较重要的机制,在处理事务的并发性方面起着至关重要的作用,我也看过好多关于锁机制的文章blog,什么悲观锁、乐观锁?什么共享锁、排他锁?还有什么行级锁、表级锁?另外还有读锁、写锁?oh,my...
  • 概述数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多说的不是很清楚(尤其更新锁)...锁的种类S、X、IS、IX数据库锁机制 很详细的教程,简单易懂1、共享锁(Shared lock)。例1:----------------------------...
  • 一、共享 什么是共享:简单来说就是该锁定的资源只能进行...数据库执行请求1的sql语句,是select语句,数据库会给该表加上共享,查询的数据保持一致,这时如果请求1还没释放共享数据库执行请求2的sq...
  • MySQL数据库锁机制

    千次阅读 2018-11-27 11:22:22
    是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须...
  • 解决高并发(数据库锁机制)

    千次阅读 2018-10-18 09:42:41
    这篇文章介绍的特别好 https://www.cnblogs.com/lpyan/p/5607669.html
  • 2 《轻松掌握MySQL数据库锁机制的相关原理》 在一个update和insert操作频繁的表中,少量数据测试的时候运行良好,在实际运营中,因数据量比较大(21万条记录),会出现死锁现象,用show processlist查看,可以看到...
  • Oracle 数据库锁机制

    2008-03-31 15:43:00
    Oracle 数据库锁机制 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的...
  • 数据库锁机制 很详细的教程,易懂

    万次阅读 多人点赞 2017-05-18 22:38:30
    数据库大并发操作要考虑死锁和的性能问题。看到网上大多语焉不详(尤其更新),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另...
  • 这边文章主要是总结一些比较好的文章对于数据库锁机制及原理的分析。 数据库锁: 首先引用一张其他博主的图: 下面我就针对这图中的锁逐一进行一下解释: 悲观锁:数据库总是认为多个数据库并发操作会发生冲突,...
  • 数据并发的问题 (脏读、不可重复读、幻象读)和数据库锁机制
  • 上一章讲到了数据库事务的隔离级别以及并发事务在不同隔离级别下可能带来的问题和解决思路,感兴趣的朋友可以看一下!点击打开链接直接切入正题: 从字面上看,行级的作用范围肯定比表级的作用范围要小;行级...
  • 场景:公司项目,采取多线程模式定时执行更新某些配置信息,当某两个或多个线程公用一个connect,execute某个sql语句的时候,会...解决办法:加线程锁机制 import threading class DB(object): metux = threadi...
  • 数据库锁机制和CAS概念

    千次阅读 2019-08-13 09:03:26
    这个作者介绍比较清晰 https://www.cnblogs.com/X-knight/p/10669934.html @勋爵

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 239,926
精华内容 95,970
关键字:

数据库锁机制

友情链接: 1.rar