小工具      在线工具  汉语词典  css  js  c++  java

Mysql for update 悲观锁实践

Java,mysql,数据库,索引,java,sql 额外说明

收录于:97天前

一、简介

悲观锁:读取数据时锁定那些行,对这些行的其他更新需要等到悲观锁结束才可以继续。

乐观锁:读取数据时不加锁。更新时,检查数据是否已更新。如果是这样,请取消当前更新。一般当悲观锁的等待时间太长而无法接受时,我们会选择乐观锁。

InnoDB行锁实现方法:InnoDB行锁是通过锁定索引项来实现的。如果没有索引,InnoDB会通过隐藏聚集索引锁定记录。

  • 共享锁(S):允许一个事务读取一行,并防止其他事务获取同一数据集上的排它锁。
  • 排他锁(X):允许获得排他锁的事务更新数据,并阻止其他事务获得同一数据集的共享锁和排它锁。

for update用于对数据库进行锁定,可以对数据库中的行设置排它锁。当一个事务的操作不完整时,其他事务可以读取但不能写入或更新。

for update仅适用于InnoDB,并且必须在begin和commit之间启用事务才能生效。

要测试更新的表锁情况,可以使用MySQL的命令模式打开两个窗口进行测试。

2、更新的行级锁和表锁的几种情况

1.显式指定主键/索引,并有这条记录,行级锁

2.没有指定主键/索引,有这条记录,表级锁

3.当我们使用范围条件而不是相等条件来检索数据并请求共享锁或排它锁时,InnoDB会锁定条件已经有数据记录的索引项,并对键值在条件内的记录添加间隙锁范围但不存在。

4.明确指定主键/索引。如果没有找到这样的记录,则添加间隙锁

5.无主键/索引,表级锁

6、主键/索引不明确,表级锁

3. 测试

开2个窗口测试:

// 执行 代码片段一
BEGIN ;  //开始事务
SELECT userName FROM user WHERE userId = 1 FOR UPDATE;


// 执行 代码片段二
BEGIN ;  //开始事务
SELECT userName FROM user WHERE userId = 1 FOR UPDATE;
update user set  userName='sun' where userId = 1;

首先执行代码片段1。再次执行代码片段2。

参考:https://www.cnblogs.com/xiao-lei/p/12598552.html

. . .

相关推荐

额外说明

Maven打包springboot项目插件 spring-boot-maven-plugin

在不使用spring-boot-maven-plugin插件打包springboot的web项目生成的jar包是无法直接运行的。因为直接打包的jar包仅仅是一个普通的jar包,没有打包依赖也没有指定main-class,所以无法直接运行。 所以需要在po

额外说明

MyBatis-Plus之注解

MyBatis-Plus之注解 1.0 MyBatis-Plus之注解 @TableName 1.1 扩展配置指定表名 2.0 注解 @TableId 2.1 @TableId 将属性对应的字段指定为主键 2.2 @TableId(value="uid"

额外说明

untiy 把多个float数据转成一个byte数据

在和别人协同开发进行udp发送信息时,需要把多个数据 转成一个byte发送,下面代码就是把多个数据组合成一个数据。 public class datas { public float a = 2.001f, b = 2.002f;

额外说明

docker 的 limits 使用,控制内存,cpu等的最大占用率

背景 最近遇到一个比较尴尬的问题,我有一个服务比较占用内存,做一些分析可能会让内存暴涨至十几个 G,但是服务器的内存又比较小,只有 4G,导致服务崩溃。 最实在的做法就是服务器扩容,但是自己测试的服务,没必要这么奢侈,但又不想一直重启服务器,官网查找发现

额外说明

【PHP面试题20】搭建一个Nginx和PHP-FPM的环境要经过哪些操作

文章目录 一、前言 二、操作指南 2.1 安装和配置 Nginx 2.2 安装和配置 PHP-FPM 2.3 配置 Nginx 和 PHP-FPM 之间的连接 2.4 最佳实践和进一步的资源 总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区

额外说明

Java讲课笔记05:运算符与表达式

文章目录 零、本讲学习目标 一、算术运算符(Arithmetic Operator) 1、分类说明表 2、注意事项 3、案例演示 任务1、计算成绩差与平均成绩 课堂练习:编程处理带余除法。 任务2、打印购物小票 任务3、幸运抽奖 - 由卡号计算幸运数 任

额外说明

update case when 多字段,多条件, mysql中case when用法

文章目录 前言 sql示例 普通写法: update case when写法 update case when 多字段写法 case when语法 case when 的坑 1、不符合case when条件但是字段被更新为null了 解决方法一:添加wh

额外说明

「每日一问」面向对象的基本特性是什么?

封装 封装是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 换而言之,类是一个封装了它自身数据和操作这些数据的代码的抽象。在类内部,某些代码或某些数据可以是私有的,不能被外界访问;也可以是私有的,

额外说明

【Python】Windows:Eclipse 中集成 Python 自动化测试开发环境

目录 一、安装 Python 二、安装 Eclipse 三、在 Eclipse 安装 PyDev 插件 四、配置 PyDev 解释器 五、新建 Python 项目

额外说明

关于extends、implements、interface的使用

Java每日一学-extends、implements、interface 谈及interface,就不得不和class对比。 class:类,引用方法需要实例化(非static) ,不可多继承(多对一),interface:抽象化,这样理解对于一类具有

ads via 小工具