首页 > 数据库 >MySQL 乐观锁

MySQL 乐观锁

时间:2024-06-16 16:01:36浏览次数:13  
标签:loc name supply address 乐观 version MySQL id

MySQL 乐观锁

乐观锁认为当前的情况是最好的情况,即每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据

drop table if exists supply_address;
-- 创建表
CREATE TABLE if not exists `supply_address` (
    `id` int NOT NULL AUTO_INCREMENT,
    `supply_no` int NOT NULL,
    `loc_no` int NOT NULL,
    `loc_name` varchar(192) DEFAULT NULL,
    `create_by` int DEFAULT NULL,
    `create_time` datetime(3) DEFAULT NULL,
    `h_version` int DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

往数据库插入1条记录

insert into supply_address(supply_no, loc_no, loc_name, create_by, create_time, h_version)
SELECT 2098,1,'test1',-1,now(),1;

-- 得到id=1 的一条记录
select * from supply_address;

现在有A,B两个用户同时修改id =1 的这条记录的name

-- A操作
update supply_address set loc_name = 'test2' where id = 1;
-- B操作
update supply_address set loc_name = 'test1' where id = 1;

结果A 更新完发现loc_name变成test1???

使用乐观锁解决这种数据不一致问题,每个人更新都要带上当前数据的版本号(h_version)

-- A操作
update supply_address set loc_name = 'test2', h_version = h_version + 1 where id = 1 and h_version = 1;
-- B操作
update supply_address set loc_name = 'test1', h_version = h_version + 1 where id = 1 and h_version = 1;

此时B操作失败,由于B使用了旧的版本去更新数据,而A操作成功!

标签:loc,name,supply,address,乐观,version,MySQL,id
From: https://www.cnblogs.com/ixan/p/18250708

相关文章

  • 《软件性能测试分析与调优实践之路》第二版-手稿节选-Mysql数据库性能定位与分析
    在做MySQL数据的性能定位前,需要先知道MySQL查询时数据库内部的执行过程。只有弄清SQL的执行过程,才能对执行过程中的每一步的性能做定位分析。如图6-2-1所示。图6-2-1从图中可以看到,当查询出数据以后,会将数据先返回给执行器,此时执行器先将结果写到查询缓存里面,这样在下次查询相......
  • 1832javaERP管理系统之车间计划管理Myeclipse开发mysql数据库servlet结构java编程计算
    一、源码特点 javaerp管理系统之车间计划管理是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助采用了serlvet设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。......
  • Mysql
    数据库原理与应用DDL和DML练习创建一个名为students的表,包含id(主键,自增长),name(字符串类型,长度为````````20),age(整数类型)和class(字符串类型,长度为20)。CREATETABLEstudents(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(20),ageINT,classVARCHAR(20));向s......
  • mysql中社区版如何查看进程中sql
    在MySQL中,你可以使用SHOWPROCESSLIST命令来查看当前正在运行的进程以及它们正在执行的SQL语句(如果有的话)。不过,默认情况下,SHOWPROCESSLIST可能不会显示完整的SQL语句,特别是当SQL语句非常长时。以下是如何在MySQL中查看进程及其SQL语句的方法:登录到MySQL:使用命令行客户端或......
  • mysql中社区版如何杀死锁
    在MySQL中,特别是社区版,当遇到锁问题时,你可能需要杀死锁定资源的进程来解决问题。以下是一些步骤和相关信息,用于在MySQL中杀死锁定的进程:查看当前进程:首先,你需要查看当前MySQL中的所有进程,以确定哪些进程可能正在锁定资源。你可以使用以下SQL命令来查看:sqlSHOWFULLPROCESS......
  • Springboot计算机毕业设计远程在线诊疗系统小程序【附源码】开题+论文+mysql+程序+部
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,远程医疗作为一种新兴的医疗模式,正逐渐受到广泛关注和认可。特别是在疫情等突发公共卫生事件的影响下,远程在线诊疗系统小程序......
  • Springboot计算机毕业设计远景民宿酒店预订小程序【附源码】开题+论文+mysql+程序+部
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的快速发展和消费者对旅游体验要求的提升,民宿作为一种独特的住宿方式,越来越受到游客的青睐。然而,传统的民宿预订方式存在着信息不对称、预......
  • MySQL之优化服务器设置(五)
    优化服务器设置高级InnoDB设置innodb_old_blocks_timeInnoDB有两段缓冲池LRU(最近最少使用)链表,设计目的是防止换出长期很多次的页面。像mysqldump产生的这种一次性的(大)查询,通常会读取页面到缓冲池的LRU列表,从中读取需要的行,然后移动到下一页。理论上,两段LRU链表将阻止......
  • Java学习 - MySQL数据库中提到的 视图 是什么? 如何使用?
    视图是什么视图是一张虚拟的表,视图本质上保存的是SQL语句,而不是实际的数据当使用视图时,视图会根据保存的SQL语句动态生成虚拟的数据表视图的优点保密性好简化操作修改限制视图的语法创建视图CREATEVIEWIFNOTEXISTS视图名AS查询语句CREATEVIEWmyviewASSE......
  • Java学习 - MySQL数据库中 变量 和 流程控制 实例
    变量变量分类系统变量全局变量:对于服务器所有的连接有效会话变量:只在当前连接有效自定义变量用户变量:只在当前连接有效局部变量:仅在BEGIN-END中有效系统变量查看所有的系统变量SHOWGLOBAL|SESSIONVARIABLES;查看某些的系统变量SHOWGLOBAL|SESSION......