版本:mysql5.5.52

存储引擎:InnoDB

隔离级别:READ-COMMITTED

示例一:

事务1:左图      事务2:右图

1、

事务2中属于快照读,基于多版本的并发控制协议——MVCC,读取的是记录可见版本,不用加锁,事务1属于当前读,加排它锁,因此事务1虽然未提交,事务2依然可以执行。快照读是mysql InnoDB存储引擎下,隔离级别为READ COMMITTED和REPEATABLE READ时,select语句默认的读取模式。

2、

事务1属于当前读,加排它锁,事务2的读取操作也是需要排他锁的,因此读取被阻塞,导致超时,直到事务1提交后,事务2才能读取:

3、

事务1属于当前读,加排它锁,但由于隔离级别为READ-COMMITTED,不加gap锁,依然可以插入,如果将隔离级别换成REPEATABLE READ,第一次插入操作被阻塞,直到事务1提交时,插入操作才执行:

gap就是索引树中插入新记录的空隙,相应的gap lock就是加在gap上的锁,主要是为了防止幻读,只在REPEATABLE READ或以上的隔离级别下的特定操作才会取得gap lock。

4、

对于事务1开启后在事务2中插入的记录,由于没有加排它锁,可以直接删除:

开启前已存在的记录,在事务1中加了排它锁,需等待事务1提交才能在事务2中删除:

示例二:

有一个后台的定时任务,定时向第三方发出状态改变请求,同时改变本地数据表的状态,但这个状态是否改变成功是需要第三方确认的,确认的方式是第三方以http请求的形式返回一个处理结果标志(成功或者失败),如果请求没有响应,则重复请求多次,直到我方响应。伪代码如下:

步骤一

我方发送状态改变请求:

@Transaction

public  void sendChange(int id){

HttpUtils.send(id,"change");

statusDao.update(id,"pendSuccess");

relatedPeopleDao.update(id,"pendFinishRequest");

}

步骤二

我方响应第三方返回的处理结果(方法被web层调用):

@Transaction

public void doResponse(int id, String resultStatus){

relatedPeopleDao.update(id,resultStatus);

statusDao.update(id,resultStatus);

}

这个程序大部分情况是可以正常运行的,因为第三方返回处理结果有一段更长的网络延时,但是否存在这种可能,在方法sendChange开始执行 relatedPeopleDao.update(id,"pendFinishRequest")

这段代码的时候, 第三方很快返回了处理结果,relatedPeopleDao.update(id,resultStatus)已经执行且持有related_people表相关记录的锁,同时等待status表的锁被释放,但是此时sendChange的一系列操作尚未提交数据库,status的相关记录表仍被事务1持有,两个事务同时持有对方的资源同时在等待对方释放相关的锁,这就产生了死锁现象。

解决方法之一是在执行doResponse操作之前先检查下related_people表相关记录的状态是否处于合适状态,状态检查是一个普通的select操作,数据库隔离级别为读已提交,因此,如果步骤一中事务未提交,则不会读取到其改变的状态,提交后才能读取到。

@Transaction

public void doResponse(int id, String resultStatus){

if(relatedPeopleDao.isPendFinishRequest(id)){

relatedPeopleDao.update(id,resultStatus);

statusDao.update(id,resultStatus);

}

}

161223、mysql锁的两个例子的更多相关文章

  1. MYSQL 锁机制 分析

    MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table WriteLock).MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执 ...

  2. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  3. 【MySQL】MySQL锁和隔离级别浅析一

    <MySQL技术内幕InnoDB存储引擎>第一版中对于MySQL的InnoDB引擎锁进行了部分说明,第二版有部分内容更新. 与MySQL自身MyISAM.MSSQL及其他平台BD锁的对比: ...

  4. MySQL锁详解

    一.概述 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.My ...

  5. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  6. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  7. Mysql锁机制--索引失效导致行锁变表锁

    Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

  8. mysql锁机制详解

    前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...

  9. Mysql锁(翻译)

    内容主要是对mysql文档的翻译. 1. shared(s) 共享锁2. exclusive(x) 排它锁 innodb的s锁和x锁是行级锁.事务T1获得s锁,事务T2仍然可以获得s锁.事务T1获得x ...

随机推荐

  1. java beans

    There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...

  2. redis 简单应用

    Incr $views = Redis::incr('views'); $article_views = Redis::incr('article:' . $article_id . ':views' ...

  3. NONUNIFORM MEMORY ACCESS

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In terms of commercia ...

  4. P1041 传染病控制

    #include <bits/stdc++.h> using namespace std; const int maxn = 301; std::vector<int> son ...

  5. ubuntu 上安装字体

    http://www.360doc.com/content/11/0901/23/4171006_145128703.shtml http://www.linuxidc.com/Linux/2008- ...

  6. RSA加密

    1.RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? 答:公钥加密私钥可解,私钥加密公钥可解. 2.RSA非对称加密特点? 答:算法强度复杂.加密解密速度比对称加密解密的速度慢.一个公钥,对外开 ...

  7. WPF 动画效果

    线性插值动画.关键帧动画.路径动画 1. (Visibility)闪烁三下,停下两秒,循环: XAML: <Grid> <Grid.ColumnDefinitions> < ...

  8. mogodb监控脚本

    mongodb_server.py #! /bin/env python #-*- coding:utf8 -*- import sys import os from bson.timestamp i ...

  9. pip的相关操作

    >Python中的pip是什么?能够做些什么? pip是Python中的一个进行包管理的东西,能够下载包.安装包.卸载包......一些列操作 >怎么查看pip的相关信息 在控制台输入: ...

  10. cs

    cs <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...