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

php中文网
发布: 2016-06-07 17:37:26
原创
1130人浏览过

最近在项目中发现了事务之间的死锁问题,所以研究了一下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

乐活途购物分享社区
乐活途购物分享社区

beta v1.1版本为第一个版本,简单的整合了基础功能,各位站长拿到程序后,不要纠结后台的功能简单,后续将不断更新扩展。在beta v1.1版本使用过程中遇到什么问题,请登录 www.loftto.com 进行反馈! 安装说明######重要提醒:程序不支持二级目录安装,请使用一级目录或二级目录绑定!#第一步,确定你的服务器支持PHP+mysql。#第二步,确定你的服务器开启了gd库。#第三步,

乐活途购物分享社区 0
查看详情 乐活途购物分享社区

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

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


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

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号