热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

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

最近在项目中发现了事务之间的死锁问题,所以研究了一下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:表达能力有限,有任何问题,欢迎交流


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

推荐阅读
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
窝窝笑丫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有