MySQL的锁问题-1

锁是我们在计算机中经常用来解决多个进程或线程并发访问临界资源的一种控制方法。

在数据库中数据也是我们临界资源的的一种,所以我们要保证在多进程、多线程的并发访问中数据的一致性和有效性。

MySQL锁的介绍

  mysql的三种锁机制:

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生所冲突的概率最高,并发度最低

2、行级锁:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最小,并发度最高

3、页级锁:开销和加锁时间在表级锁和行级锁之间;会出现死锁;锁定粒度位于表锁和行锁之间,并发度一般

  关于三种锁机制的选用

要根据实际实现的业务去选择,表级锁适合以查询为主的业务,只有少量按索引条件去更新数据的应用;

行级锁适合有大量并发按索引去更新少量数据的操作


MyISAM表锁

MyISAM存储殷勤只支持表锁

查询表级锁的争用

如果Table_locks_waited的值比较高,则说明有较为严重的表级锁争用

MySQL表级锁的锁模式

请求锁模式

是否兼容

当前锁模式

none读锁写锁
读锁
写锁

由表格中可以看出:MyISAM对于读操作,它不会去阻塞其他用户对于同一张表的读,但会阻塞其他用户的写。对于写操作,则其他用户的读写都会被阻塞。所以表级锁模式下,读与写、写与写操作是串行的。

加表锁

MyISAM在执行查询语句前会给涉及的表加上一个读锁,在执行更新操作的时候会给涉及到的表加上写锁。

给MyISAM显示加上锁一般是为了模拟事务的操作,当有多条SQL要执行时涉及多张表,这个时候执行到后面的时候表里的数据可能会发生改变,这个时候为了保证数据的一致性,我们会给多条SQL统一加锁。

ps:对表加锁,但是通过别名来访问时会出现错误,需要分别对别名进行锁定

lock table tablename as alias read | write

MyISAM的锁调度

在MyISAM中读写操作是互斥的,MySQL中两个请求之间,默认是写请求的优先级大于读请求,所以当有大量更新操作是,极为容易造成一直阻塞的现象,这个时候我们往往要自己去定义读写的优先级。

1、通过指定启动参数low-priority-updates,使得MyISAM引擎默认给予读请求以优先的权力

2、通过执行命令set low_priority_updates=1,使得该连接发出的更新请求优先级降低

3、通过指定insert,update,delete语句的low_priority属性,来降低语句的优先级

4、给系统参数max_write_lock_count设置一个合适的值,当表的读锁达到一定数量的时候MySQL就会暂时将写请求的优先级降低

参考书籍:深入浅出MySQL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值