mysql锁总结
来源:互联网 发布:游戏美工培训费用 编辑:程序博客网 时间:2024/04/27 17:43
2,MyISAM表的读和写是串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行
3,MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
当concurrent_insert设置为0时,不允许并发插入。
当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录
解决应 用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允许并发插入;同时,通过定期在系统空闲时段执行 OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞
¡ 通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
¡ 通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
¡ 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
虽然上面3种方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。
另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。
上面已经讨论了写优先调度机制带来的问题和解决办法。这 里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”!因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语 句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每 一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行。
InnoDB的行锁模式及加锁方法
InnoDB行锁模式兼容性列表
InnoDB实现了以下两种类型的行锁:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事 务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。
由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的
参考:http://xu20cn.blog.51cto.com/274020/72574
http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html
http://www.cnblogs.com/benshan/archive/2013/01/17/2865286.html
http://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html
- mysql锁总结
- mysql各种锁总结
- mysql锁总结
- mysql锁机制总结
- mysql 锁总结
- 学习总结--MYSQL 锁
- mysql悲观锁总结
- mysql乐观锁总结
- mysql乐观锁总结
- mysql的锁总结
- 【MySQL】(2)MySQL锁机制总结
- mysql的锁机制总结
- mysql型锁机制总结
- MySQL总结
- MySQL 总结
- mysql总结
- MySql总结
- MySQL总结
- Spring整合JDBC实现简单的增删改续-实现基于RowMaper的查询
- 黑马程序员——集合、集合框架工具类(collections和Arrays)和其他对象
- java基础:继承与接口
- IOS SEL (@selector) 原理及使用总结(一)
- iOS UIWebView 全屏播放视频, 需横屏,单app不支持横屏, 解决办法
- mysql锁总结
- 无法获得锁 /var/cache/apt/archives/lock – open (11 资源临时不可用)
- SQL SERVER 面试题
- linux 常用目录详解
- 解决虚拟机不能上网问题
- XPath 简记
- leetCode Triangle 解题分享
- Cocos2d-x 粒子编辑器使用和渲染特效
- 快速排序函数模板