mysql锁

作者: 某言 | 来源:发表于2020-06-16 09:11 被阅读0次

在做大型并发的业务的时候,mysql的锁对整个程序的正确运行和高效运行都有很重要的作用。这次研究的mysql的锁的机制,现将代码记录下参考(线程一的执行序号对应线程二的执行序号):

线程一的几个操作

-- 【1】
-- 加表级别的写锁
-- LOCK TABLES tb_volunteer write;
-- UNLOCK TABLES; -- 最后在执行

-- 【2】
-- 事务中的锁【更新】
set autocommit  = 0;
begin;
update tb_volunteer set nation='回族' where user_id = 75;
commit; -- 最后执行

-- 【3】
-- 事务中的排他锁【查询】
set autocommit = 0;
begin work;
select * from tb_volunteer where user_id = 75 for update; -- 仅自己更新,其他可以查询,更新阻塞
commit work;

-- 【4】
-- 事务中的共享锁
set autocommit = 0;
begin;
SELECT * from tb_volunteer where user_id = 75 LOCK IN SHARE MODE; -- 仅多人查询,谁都不能更新
commit;

-- 聚合中的锁【5】
-- 实际上是一个表锁了
set autocommit =0;
begin;
select max(code) from tb_volunteer where age_group = 1 for update ;
update tb_volunteer set nation='壮族' where user_id = 75;
commit;

-- 【6】
-- 行锁在非索引字段时候可否
-- 即使条件字段不是索引字段,也可以上锁
set autocommit=0;
begin;
select * from tb_volunteer where id = 215 for update;
commit;

-- 【7】
-- 查询时候不加特殊条件是否阻塞
set autocommit = 0;
begin;
select * from tb_volunteer where id = 211;
commit; -- 最后执行




线程二对应(序号)的几个操作

-- 【1】
-- 若不解表锁一直阻塞
select * from tb_volunteer;

-- 【2】
-- 不commit提交事务不同线程阻塞,commit后其他线程可继续
update tb_volunteer set nation='壮族' where user_id = 25;

-- 【3】
-- 不commit提交事务他人阻塞,同线程可改,commit后其他线程继续
update tb_volunteer set nation='维吾尔族' where user_id = 75;

-- 【4】
-- 再次尝试了下,感觉和for update差别不大,别人线程都是只能读,不能写,自己线程能读能写
select * from tb_volunteer where user_id = 75; -- 【可直接执行】
update tb_volunteer set nation='彝族' where user_id = 75; -- 【commit之后才能执行】

-- 【5】
-- 聚合上锁研究
select * from tb_volunteer where age_group = 1
update tb_volunteer set nation='汉族' where user_id >75 and age_group = 2 ;

-- 【6】
-- 行锁在非索引字段时候可否【6】:可
update tb_volunteer set nation='藏族' where id = 215;

-- 【7】
-- 查询时候即使没有commit,也能更新
update tb_volunteer set nation = '壮族' where id = 211

相关文章

  • Mysql的锁

    MySql锁的分类 Mysql里的锁大致可以分为全局锁、表级锁和行锁三类。 全局锁 Mysql 增加全局锁的方法:...

  • MySQL二进制日志

    MySQL-day10 MySQL存储引擎-锁 1)什么是“锁”? 2)“锁”的作用是什么? 3)MySQL中的锁...

  • MySQL的锁机制

    mysql的锁机制 1、MySQL锁的基本介绍 MyISAM:MySQL的表级锁有两种模式:表共享读锁(Table...

  • MS汇总

    数据库相关[MS-关于锁(乐观锁,悲观锁,行锁、表锁,共享锁,排他锁)Mysql索引优化Mysql查询优化Mysq...

  • Mysql 之 锁表与解表

    Mysql 之 锁表与解表 Mysql 查看锁表语句 mysql>show open tables where i...

  • rails中乐观锁和悲观锁的使用

    MySQL乐观锁和悲观锁的介绍可以参考之前的一篇文章MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)...

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • 共享 + 排他锁

    mysql锁机制分为表级锁和行级锁 ,mysql中行级锁中的共享锁与排他锁进行分享交流。 测试语法 begin; ...

  • (4)头条mysql

    1、MySQL有哪些锁,乐观锁和悲观锁实现 如果避免、减少锁等待、团队中如何监控MySQL的锁等待的情况 锁监控:...

  • MySQL锁篇

    1 MySQL锁介绍 2 MySQL表级锁 2.1 表级锁介绍 ​ 表级锁由SQL layer实现。M...

网友评论

      本文标题:mysql锁

      本文链接:https://www.haomeiwen.com/subject/cyhjzhtx.html