mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)
一. 什么时候使用表锁
对于INNODB表,在绝大部分情况下都应该使用行锁。在个别特殊事务中,可以考虑使用表锁(建议)。
1. 事务需要更新大部份或全部数据,表又比较大,默认的行锁不仅使这个事务执行效率低,可能造成其他事务长时间锁等待和锁冲突,这种情况考虑使用表锁来提高事务的执行速度(具我在sql server中的经历,该大表有上100w,删除40w,表锁有时会造成长时间未执行完成. 还是使用分批来执行好)。
2. 事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况可以考虑一次性锁定事务涉及的表,避免死锁,减少数据库因事务回滚带来的开销。
使用表锁注意两点
(1) lock tables虽然可以给innodb加表锁,但表锁不是由innodb存储引擎层管理,则是由上层mysql server负责。仅当autocommit=0, innodb_table_locks=1(默认设置)时,innodb层才知道mysql加的表锁,mysql server也才能感知innodb加的行锁。
(2) 用lock tables对innodb表加锁时要注意, 要将autocommit 设置为0,否则mysql 不会给表加锁; 事务结束前,不要用unlock tables释放表锁,因为它会隐式的提交事务。 commit 或rollback 并不能释放用lock tables 加的表锁。事务结束后必须用unlock tables释放表锁。
会话2设置SET autocommit =0
-- 会话1 给city加表锁读, 不设置 SET autocommit =0LOCK TABLES city READ
-- 会话2 会阻塞UPDATE city SET CityCode='005' WHERE city_id=103
-- 会话1提交COMMIT;-- 会话1 释放表锁UNLOCK TABLES;
二. 关于死锁
在myisam中是使用的表锁,在获得所需的全部锁时, 要么全部满足,要么等待,因此不会出现死锁(myisam)。下面在innodb中演示一个死锁例子:
会话1 |
会话2 |
SET autocommit =0 SELECT * FROM city WHERE city_id=103 FOR UPDATE; |
SET autocommit =0 SELECT * FROM cityNew WHERE city_id=103 FOR UPDATE; |
-- 因为会话2 已获得排他锁, 该语句等待 SELECT * FROM cityNew WHERE city_id=103 FOR UPDATE; |
|
-- 死锁 SELECT * FROM city WHERE city_id=103 FOR UPDATE; 错误代码: 1213 Deadlock found when trying to get lock; try restarting transaction |
上面案例中, 两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。 发生死锁后,innodb会自动检测到,并使一个事务释放锁并回退(回滚),另一个事务得锁完成事务。
三. 锁等待查看时间
涉及外部锁或表锁,innodb并不能完全自动检测到死锁,这需要设置锁等待超时参数innodb_lock_wait_timeout来解决(设置需慎重),这个参数并不是只用来解决死锁问题,在并发下,大量事务无法立即获得所需锁而挂起,将占用大量资源,甚至拖跨数据库 (在sql server中默认是-1 总是等待)。
-- 下面是5秒 获取不到锁就超时 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
转载于:https://www.cnblogs.com/MrHSR/p/9409090.html
mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)相关推荐
- mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)
1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...
- mysql 开发进阶篇系列 7 锁问题(innodb锁争用情况及锁模式)
1 .获取innodb行锁争用情况 1.1 通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况 SHOW STATUS LIKE 'innodb_row_lock%' 通过in ...
- mysql 开发进阶篇系列 41 mysql日志之慢查询日志
一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间.慢日志默认写入到参数datadir(数据目录)指定的路径下.默认文件 ...
- mysql 开发进阶篇系列 22 磁盘I/O问题(从linux操作系统上优化)
1. 使用Symbolic Links分布I/O mysql的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数datadir定义的目录下.如果不使用RAID或 ...
- mysql 开发进阶篇系列 32 工具篇(mysqladmin工具)
一.概述 mysqladmin是一个执行管理操作的客户端程序.用来检要服务的配置和当前的状态,创建并删除数据库等.功能与mysql客户端类似,主要区别在于它更侧重于一些管理方面的功能. 1. 查找my ...
- mysql 开发进阶篇系列 34 工具篇 mysqlcheck(MyISAM表维护工具)
一.概述 mysqlcheck客户端工具可以检查和修复MyISAM表,还可以优化和分析表.实际上,它集成了mysql工具中check,repair,analyze,optimize功能,对于check ...
- mysql 开发进阶篇系列 23 应用层优化与查询缓存
一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...
- mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...
- mysql第三方工具binlog_mysql 开发进阶篇系列 33 工具篇(mysqlbinlog日志管理工具)
一.概述 由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具. mysqlbinlog的语法如下: mysqlbinlog ...
- mysql key buffer_mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)
一.概述 mysql 提供了很多参数来进行服务器的设置,当服务第一次启动的时候,所有启动参数值都是系统默认的.这些参数在很多生产环境下并不能满足实际的应用需求.在这个系列中涉及到了linux 服务器, ...
最新文章
- 简明python教程购买-简明Python教程:基本语法
- python画一束花_用python画一朵玫瑰花,拿去表白趴-Go语言中文社区
- 03.elasticsearch-mapping-param解析
- axure实现复选框全选_AxureRP8实战手册-案例73(全选与取消全选效果)
- 道指mt4代码_剑指offer算法题052:正则表达式匹配
- 2017-03-16 Codeforces 453A 概率期望,思维 UOJ 228(待补)
- Github git clone国内mirror加速
- Menagerie(AtCoder-2234)
- php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
- 使用CucumberJS,让JavaScript与行为驱动开发结合
- [网络流24题] 最长k可重线段集问题 (费用流)
- [译]ASP.NET 5 Configuration
- How Google Tests Software (出书,停止更新)
- Git教程 Git Bash详细教程
- 微软windows10易升_Windows10开启卓越性能
- java映射的概念_Java之路:映射(Map)
- ipxspx协议linux,三大协议 TCPIP NETBIOS IPX (转)
- Windows 10, version 21H2 (released Nov 2021) 简体中文版、英文版(企业版)下载
- RFC2833 - 用于DTMF数字信号、电话音和电话信号的RTP负载格式
- 华测教育入选【腾讯课堂 · 薪选课程】--这可能是你进腾讯的最好机会!