一、行锁概念及特点

  1.概念:给单独的一行记录加锁,主要应用于innodb表存储引擎

  2.特点:在innodb存储引擎中应用比较多,支持事务、开销大、加锁慢;会出现死锁;锁的粒度小,并发情况下,产生锁等待的概率比较低,所以支持的并发数比较高。

二、数据库事务

  1.概念:事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是说要么全部都执行,要么全部不执行。

  2.特性:ACID

    原子性:事务是最小的工作单元,不可分割,要么都做,要么都不做

    一致性:事务执行前和执行后的数据要保证正确性,数据完整性没有被破坏。

    隔离性:在并发事务执行的时候,一个事务对其他事务不会产生影响。

    持久性:一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的

三、多个事务并发执行 问题及解决方案

  1.问题

    1) 丢失更新:在没有事务隔离的情况下,两个事务同时更新一条数据,后一个事务 会 覆盖前面事务的更新,导致前面的事务丢失更新。

    2) 脏读:事务A先更新数据,但是没有提交,事务B读到了事务A没有提交的数据。

    3) 不可重复读:事务A中,先读到一条数据,事务A还没有结束,此时,事务B对该条数据进行了修改操作,事务A又读到了这条数据,事务A两次读到的数据不同。

    4) 幻读:事务A先读到一批数据,假设读到10条,事务B插入了一条数据,此时,事务A又读这一批数据,发现多了一条,好像幻觉一样。

    注:不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样。

        幻读的重点在于新增或者删除,同样的条件,第 1 次和第 2 次读出来的记录数不一样。

  2.解决方案--数据库隔离机制

   1) 未提交读(read uncommitted):这是数据库最低的隔离级别,允许一个事务读另一个事务未提交的数据。

    解决了丢失更新,但是会出现脏读、不可重复读、幻读。

   2) 提交读(read committed):一个事务更新的数据 在提交之后 才可以被另一个事务读取,即一个事务不可以读取到另一个事务未提交的数据。

    解决了丢失更新和脏读,但是会出现不可重复读和幻读。

   3) 可重复读(repeatale read):这是数据库默认的事务隔离级别,保证一个事务在相同条件下前后两次读取的数据是一致的。

    解决了丢失更新、脏读和不可重复读,但是会出现幻读。

   4) 序列化(serializable):这是数据库最高的隔离级别。事务串行执行,不会交叉执行。

    解决了所有的问题。

   注:乐观所可以解决幻读。

四、行锁的特性

  查看mysql事务隔离级别:show variables like 'tx_iso%';

  前提:set autocommit=0;   // 设置自动提交事务为手动提交 

 /* 行锁案例*/
 create table lock_two(
id int,
col int
)engine=innodb; insert into lock_two(id,col) values (1,1);
insert into lock_two(id,col) values (2,2);
insert into lock_two(id,col) values (3,3);

  1.在session1中执行update :   update lock_two set col=11 where id=1;

    (1)分别在session1和session2中查询lock_two,看id为1的记录的col是否修改了。

       

    发现session1 的记录修改了,session2中的记录没有被修改。

    (2)在session1中执行commite后,然后再在session2中查询:

       

     发现session2中的表数据改变了。

  2.在session1中执行update:update lock_two set col=11 where id=1,不执行commit;

在session2中执行uodate :update lock_two set col=11 where id=1,不执行commit;

   

     发现session2中的update发生阻塞,并且超过一段时间报错。

  3.在session1中执行update:update lock_two set col=22 where id = 2; 不执行commit

     在session2中执行另一条update:update lock_two set col=33 where id = 3;

      

   此时,session2中的update发生阻塞,在没发生错误的情况下,session1执行commit,session2中的update会马上执行。

  4.在lock_two中创建索引,

    create index idx_id on lock_two(id);

    create index idx_col on lock_two(col);

   然后重复第3步,

   

     发现session2可以更新,不会产生阻塞。因为用上了索引,相当于行锁。

   结论:如果没有用上索引,行锁变成表锁

五、手动锁一行记录格式

     begin;

      select * from lock_two where id=2 for update;

  1. 在session1中执行上面语句,在ssesion2中可以查看,但是不可以修改 sesion1中的for update 的记录。

  2. 当session1中执行commit后,seesion2中的update立刻执行。

六、间隙锁

  1.定义:在范围查找的情况下, innodb会给范围条件中的数据加上锁,无论数据是否是否真实存在。

  2.例子:

    在session1中update:update lock_two set col=666 where id>2 and id<8;

    1) 在session2中执行insert:insert into lock_two values(9,99);

    插入执行成功!

    2) 在session2中执行insert:insert into lock_two values(7,77);

    插入阻塞,一段时间后报错!

    执行select:select * from lock_two where id=4;

    查询成功!

    建议:在innodb中,因为有间隙锁的存在,最好在where中少使用这种范围查找。

七、查看行锁的信息

  show status like 'innodb_row_lock%';

  

  说明:

Innodb_row_lock_current_waits :当前正在等待的数量

   Innodb_row_lock_time: 从启动到现在锁定的总时长,单位是ms

   Innodb_row_lock_time_avg :锁等待的平均时长

   Innodb_row_lock_time_max:等待锁时间最长的一个时间

   Innodb_row_lock_waits:总共的等待次数

MySQL性能优化(七·下)-- 锁机制 之 行锁的更多相关文章

  1. MySQL性能优化(七):其它优化

    原文:MySQL性能优化(七):其它优化 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/v ...

  2. mysql锁机制之行锁(四)

    前言 顾名思义,行锁就是一锁锁一行或者多行记录,mysql的行锁是基于索引加载的,所以行锁是要加在索引响应的行上,即命中索引,如下图所示: InnoDB 支持多粒度锁(multiple granula ...

  3. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  4. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  5. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

  6. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  7. mysql 性能优化方案1

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  8. mysql 性能优化方案 (转)

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  9. MySQL性能优化总结(转)https://yq.aliyun.com/articles/24249

    摘要: 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图:   三.MySQL存储引擎概述 1)MyISAM存储引擎 MyIS ...

随机推荐

  1. Codeforces 877 C. Slava and tanks

    http://codeforces.com/problemset/problem/877/C   C. Slava and tanks time limit per test 2 seconds me ...

  2. 已经菜到不行了 PAT 1010. Radix (25)

    https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...

  3. 第八届蓝桥杯c/c++省赛题目整理

    第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都 ...

  4. 全链路追踪traceId,ThreadLocal与ExecutorService

    关于全链路追踪traceId遇到线程池的问题,做过架构的估计都遇到过,现在以写个demo,总体思想就是获取父线程traceId,给子线程,子线程用完移除掉. mac上的chrome时不时崩溃,写了一大 ...

  5. llg的农场(farm)

    评测传送门 [题目描述] llg 是一名快乐的农民,他拥有一个很大的农场,并且种了各种各样的瓜果蔬菜,到了每年秋天,他就可以把所有蔬菜水果卖到市场上,这样他就可以获利.但今年他遇到了一个难题——有许多 ...

  6. datatable表格框架服务器端分页查询设置

    更多内容推荐微信公众号,欢迎关注: js代码如下: $('#mytable').dataTable( { "bServerSide": true, //开启服务器模式,使用服务器端 ...

  7. Ubuntu 通过 Live CD 更新grub恢复引导Boot Menu

    工作需要更换主板,但是不想重装电脑. 怎么办呢? 其实并不需要重装电脑,只需要回复boot menu即可. 1. 首先用u盘制作一个ubuntu的live CD(请自行百度),然后通过u盘启动, 选择 ...

  8. wamp中mysql安装时能启动,重启后无法启动的解决办法

    第一次安装wamp之后,所有服务可以正常使用,但是重启之后wamp的图标就变成黄色的了,重装了也这样 查看一下错误日志: 日志显示的错误是这样的: 日志提示可能是3306端口被占用的错误,那来看一下是 ...

  9. 全网最全JS正则表达式 校验数字

    Js代码 <script type="text/javascript"> function SubmitCk() { var reg = /^([a-zA-Z0-9]+ ...

  10. 使用 script 命令记录用户操作行为

    Script 命令可以帮助管理员记录用户的操作行为,包括用户查看文件中的哪些具体内容,写入了哪些文件,写了些什么都能看到,比较详细的记录了用户的操作行为. 本文对此进行简要说明. 1.添加日志记录 e ...