innodb事务锁
2018-06-17 22:50:06来源:未知 阅读 ()
- 控制对共享资源进行并发访问
- 保护数据的完整性和一致性
mysql> show status like '%innodb_row_lock%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 0 | | Innodb_row_lock_time_avg | 0 | | Innodb_row_lock_time_max | 0 | | Innodb_row_lock_waits | 0 | +-------------------------------+-------+ 5 rows in set (0.00 sec)
- 共享锁(S)-读锁-行锁
- 排他锁(X)-写锁-行锁
- 意向共享锁(IS)-表级 :事务想要获得一张表中某几行的共享锁
- 意向排他锁(IX)-表级:事务想要获得一张表中某几行的排他锁
- 意向锁总是自动先加,并且意向锁自动加自动释放
- 意向锁提示数据库这个session将要在接下来将要施加何种锁
- 意向锁和X/S 锁级别不同,除了阻塞全表级别的X/S锁外其他任何锁
select * from tb_test for update;
自动:update,delete 前
mysql>show global variables like "%wait%"
- 只有条件走索引才能实现行级锁 a)
- 索引上有重复值,可能锁住多个记录 b)
- 查询有多个索引可以走,可以对不同索引加锁 c)
- 是否对索引加锁实际上取决于Mysql执行计划
mysql> show create table t2\G; *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 mysql> select * from t2; +------+------+ | a | b | +------+------+ | 1 | 2 | | 1 | 3 | +------+------+ 此时A连接 在b =2 时加 写锁; mysql> select * from t2 where b =2 for update; +------+------+ | a | b | +------+------+ | 1 | 2 | +------+------+ 而此时再B连接中再对b=3,加写锁时,失败; mysql> select * from t2 where b=3 for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> show create table t2\G; *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> select * from t2; +------+------+ | a | b | +------+------+ | 1 | 2 | | 1 | 3 | | 2 | 9 | +------+------+ 在A连接中,在a=1,b=2处加一个写锁;实际上 是在a=1这个索引上加的锁 mysql> select * from t2 where a=1 and b=2 for update; +------+------+ | a | b | +------+------+ | 1 | 2 | +------+------+ 1 row in set (0.00 sec) 在B连接中,在a=1 and b=3处加写锁失败,因都是a=1这个索引,而A中已经对a=1这个索引的行加过了锁; mysql> select * from t2 where a =1 and b=3 for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 此时B连接是可以对 a=2 and b =9 这一行中,在a=2 这个索引上加锁的; mysql> select * from t2 where a=2 and b =9 for update ; +------+------+ | a | b | +------+------+ | 2 | 9 | +------+------+
mysql> select * from t2 where b =9 for update ;
mysql> show create table t2\G; *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, KEY `a` (`a`), KEY `b` (`b`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 mysql> select * from t2; +------+------+ | a | b | +------+------+ | 1 | 2 | | 1 | 3 | | 2 | 9 | +------+------+ 在A连接中对 a=1 and b=2 加锁; mysql> select * from t2 where a =1 and b =2 for update; +------+------+ | a | b | +------+------+ | 1 | 2 | +------+------+ 此时B连接中对a =1 and b=3 ,也是可以加锁的;这是因为mysql 可以从a=1这个索引来加锁,也可以对b=3加锁; 所以就与上面b)中只能对a=1索引来加锁 区别开来; mysql> select * from t2 where a =1 and b =3 for update; +------+------+ | a | b | +------+------+ | 1 | 3 | +------+------+
mysql> select * from t2; +------+------+ | a | b | +------+------+ | 20 | 2 | | 24 | 4 | | 27 | 5 | | 27 | 6 | | 27 | 8 | | 30 | 6 | | 31 | 4 | | 32 | 9 | +------+------+ 8 rows in set (0.00 sec) 在A连接中给a=27 加锁(a 是有索引的) mysql> select * from t2 where a=27 for update; +------+------+ | a | b | +------+------+ | 27 | 5 | | 27 | 6 | | 27 | 8 | +------+------+ 3 rows in set (0.00 sec)
- 由一句单独的sql语句在一个对象上持有的锁的数量超过了阈值,默认这个阈值为5000.值得注意的是,如果是不同对象,则不会发生锁升级。
- 锁资源占用的内存超过了激活内存的40%时就会发生锁升级
- 了解触发死锁的sql所在事务的上下文
- 根据上下文语句加锁的范围来分析存在争用的记录
- 通常改善死锁的主要方法:
- 更新丢失
- innodb意向锁:
-
- 表锁
- 自动施加、自动释放
- 为了揭示事务下一行将被请求的锁类型
- S锁:in share mode
- X锁:for update
- innodb行锁特点:
-
- 只有条件走索引才能实现行锁
- 索引上有重复值可能锁住多个记录
- 查询有多个索引可以走,可以对不同索引加锁
- gap lock:间隙锁,消灭幻读
- 死锁解决:数据库挑回滚代价较小的事务回滚;
- 死锁预防:
-
- 单表,更新条件排序
- 避免跨表事务,缩短事务长度
- 锁升级:
-
- 单独sql语句在单个对象的锁数量超过阙值
- 锁资源占用的内存超过了激活内存的40%;
- innodb根据页进行加锁,并采用位图方式,定位到行的,所需资源较小
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:mysql基础测试
- 深入学习MySQL事务:ACID特性的实现原理 2019-08-23
- 深入理解PHP+Mysql分布式事务与解决方案 2019-08-13
- mysql事务处理用法与实例详解 2019-08-09
- php多进程模拟并发事务产生的问题,可学习参考 2019-08-09
- 关于MySql 数据库InnoDB存储引擎介绍 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash