MySQL实际应用中遇到的锁问题

最近在项目中发现了事务之间的死锁问题,所以研究了一下MySQL锁机制,并且延伸到了MVCC等周边知识,我只在这里介绍一下开发中可能遇到的问题,具体内容推荐阅读

最近在项目中发现了事务之间的死锁问题,所以研究了一下mysql锁机制,并且延伸到了mvcc等周边知识,我只在这里介绍一下开发中可能遇到的问题,具体内容推荐阅读《高性能mysql》。

前言:mysql有两种锁机制——读锁(共享锁)和写锁,意思就是一个进程获取读锁的话,所有进程都可以进行读,但不可以写,如果一个进程获取了写锁,那除了这个进程之外其他进程都不可以进行读写。由于myisam不存在死锁的问题也不支持事务,所以这里主要介绍关于innodb的锁机制。

1、两个进程同时访问数据库中的同一条记录,一个是读,,一个是写,在mysql会怎样执行呢?
在myisam中,会先进行写锁(锁表),然后进行写操作,读操作在后面阻塞,等写操作完成释放锁,才进行读操作,为什么这样呢,因为在mysql中写操作优先级高于读操作,甚至有的时候写操作来的比读操作来得晚也会排在读操作前执行,而在innodb中则是同时进行,互相不干扰,这就是MVCC(多版本控制)的功劳。

2、在事务中的死锁?

//SQL1 start transaction; update test set where id=1; update test set where id=2; commit;//SQL2 start transaction; update test set where id=2; update test set where id=1; commit;

上面两个事务,如果他们都执行完第一条sql的时候,第二个事务执行了第二条sql,但是第一个事务中已经对id=1的行进行了锁定,然后就会等待第一个事务commit,当第一个事务执行第二个sql的时候发现第二个事务已经对id=2的行进行了锁定,所以会等待第二个事务commit,结果就造成了死锁,这里有一个知识点,就是事务是一个整体,只有全执行完了才算结束,这也是为什么执行完一条sql后还是锁定行。

解决办法:死锁在很多数据库中都存在,解决办法就是避免死锁,比如上面的例子,你可以把两个事务的sql数序写成一样的,第一个更新id=1的,第二个更新id=1的。在innodb中,它会自动判断是否发生了死锁,如果发生了,它会让其中一个事务成功,另一个事务报错deadlocked

3、如果两个人同时编辑一篇文章冲突了怎么办?
当第一个人编辑完就提交了,可是第二个人不知道,他编辑完也提交了,这样就把第一个人编辑的内容覆盖了,这就引出了乐观离线锁概念,具体内容可以看我另一篇文章===>12306抢票问题

PS:表达能力有限,有任何问题,欢迎交流

本文出自 “村长爱技术” 博客,请务必保留此出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1864512.html

(0)
上一篇 2025年2月22日 06:54:49
下一篇 2025年2月22日 06:55:03

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • navicate连接mysql数据库报错了怎么办

    问题描述: 安装好navicate后连接mysql出现如下图所示错误: 解决方法: 1、打开命令提示符,输入命令进入mysql 2、输入命令【ALTER USER ‘root’@’localhost&#8…

    2025年2月23日 数据库
    100
  • navicat怎么连接数据库

    navicat连接数据库的方法是:1、打开navicat,点击【连接】,选择数据库种类;2、填写连接名,输入数据库密码;3、右键点击新建的连接,选择【新建数据库】;4、输入数据库名,选择字符集规则即可。 (推荐学习:mysql教程) 1、打…

    2025年2月23日 数据库
    100
  • 使用navicat克隆数据库的操作是什么

    工作中经常要使用到navicat,因此打算记录日常使用到的操作。 (学习视频分享:mysql视频教程) 一、操作步骤: 1、右击数据库,新建一个数据库 2、工具-》数据传输 3、一直点击下一步 相关推荐:navicat教程 以上就是使用na…

    2025年2月23日 数据库
    100
  • 使用navicat怎么导出整个数据库

    首先我们要明确一点,navicat在使用转存为SQL文件的方式导出数据库时,如果有外键那么就会导致导入时出错,因此我们需要使用数据传输的方式进行导出。 (学习视频分享:编程视频) 选成使用文件方式进行保存 高级选项需选成 这样导出的SQL脚…

    2025年2月23日 数据库
    100
  • navicat如何查看mysql的操作记录

    出于好奇,想在navicat中查看mysql的操作记录,特此记录一下。 (学习视频分享:编程入门) 其实方法很简单,连接一个库,用快捷键Ctrl+H就好了。 你瞧,这历史日志就出来了。 如果快捷键有冲突的话,那么就点击左上角的【工具】,选择…

    2025年2月23日
    100
  • navicat如何查看mysql日志

    navicat查看mysql日志的具体方法: 1、使用Navicat服务器监控工具 2、打开日志开关 右边参数设置变量”log”值为”ON” 3、定位日志位置,查看日志 4、执行SQL注入语句…

    2025年2月23日 数据库
    100
  • navicat怎么建立数据库

    Navicat 建立数据库的步骤包括:连接到数据库服务器。创建数据库。设置数据库选项。创建表。插入数据。 如何使用 Navicat 建立数据库 步骤 1:连接到数据库服务器 打开 Navicat,点击“连接”菜单,选择“MySQL”。在“连…

    2025年2月23日
    100
  • 怎么用navicat创建一个数据库

    如何使用 Navicat 创建数据库?连接到 MySQL 服务器,输入连接信息并验证连接。右键单击连接,选择“新建数据库”并输入数据库名称。可选:右键单击数据库,选择“属性”以设置数据库属性。右键单击数据库,选择“新建表”并填写表名、字段和…

    2025年2月23日
    100
  • navicat怎么连接localhost

    通过 Navicat 连接 localhost 需按以下步骤操作:打开 Navicat 并新建连接。选择 MySQL 连接类型。输入主机名 localhost、默认端口 3306、默认用户名 root 和密码。测试连接以确保成功。保存连接并…

    2025年2月23日
    100
  • navicat怎么连接其他人的数据库

    在 Navicat 中连接他人的数据库,需要以下步骤:获取数据库连接信息(主机名、数据库名称、用户名、密码、端口号);在 Navicat 中创建连接,选择数据库类型并配置连接参数;测试连接并保存连接信息,即可访问他人的数据库。 如何使用 N…

    2025年2月23日
    100

发表回复

登录后才能评论