mysql proxy 悲观锁_mysql悲观锁总结和实践

使用场景举例:以MySQL InnoDB为例

商品t_goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。

一、如果不采用锁,那么操作方法如下:

//1、查询出商品信息

select status from t_goods where id=1;

//2、根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1);

//3、修改商品status为2

update t_goods set status=2 where id=1;

上面这种场景在高并发访问的情况下很可能会出现问题。

前面已经提到,只有当goods status为1时才能对该商品下单,上面第一步操作中,查询出来的商品status为1。但是当我们执行第三步Update操作的时候,有可能出现其他人先一步对商品下单把goods status修改为2了,但是我们并不知道数据已经被修改了,这样就可能造成同一个商品被下单2次,使得数据不一致。所以说这种方式是不安全的。

二、使用悲观锁来实现:

在上面的场景中,商品信息从查询出来到修改,中间有一个处理订单的过程,使用悲观锁的原理就是,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。

注:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

我们可以使用命令设置MySQL为非autocommit模式:

set autocommit=0;

设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:

//0、开始事务

begin;/begin work;/start transaction; (三者选一就可以)

//1、查询出商品信息

select status from t_goods where id=1 for update;

//2、根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1);

//3、修改商品status为2

update t_goods set status=2 where id=1;

//4、提交事务

commit;/commit work;

注:上面的begin/commit为事务的开始和结束,因为在前一步我们关闭了mysql的autocommit,所以需要手动控制事务的提交,在这里就不细表了。

上面的第一步我们执行了一次查询操作:select status from t_goods where id=1 for update;

与普通查询不一样的是,我们使用了select…for update的方式,这样就通过数据库实现了悲观锁。此时在t_goods表中,id为1的那条数据就被我们锁定了,其它的事务必须等本次事务提交之后才能执行。这样我们可以保证当前的数据不会被其它事务修改。

注:需要注意的是,在事务中,只有SELECT … FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT … 则不受此影响。拿上面的实例来说,当我执行select status from t_goods where id=1 for update;后。我在另外的事务中如果再次执行select status from t_goods where id=1 for update;则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,但是如果我是在第二个事务中执行select status from t_goods where id=1;则能正常查询出数据,不会受第一个事务的影响。

补充:MySQL select…for update的Row Lock与Table Lock

上面我们提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

https://www.cnblogs.com/linjiqin/category/283837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL吉连_Learn Jdbc : Java, Jdbc, Odbc

Learn Jdbc : Java, Jdbc, Odbc 介绍Learn Jdbc : Java, Jdbc, OdbcLearn JDBC we precisely name what we are going to help you for Learning.As you are Beginner we keep in mind the same thing,we think like you and try to Build Apps Like Java Deep Learning,Java B…

python虚拟环境打包deb_可以为python脚本创建deb包吗?

下面是python脚本源包的一个基本示例。虽然大多数打包教程都有点复杂,但如果遇到问题,它们确实可以帮助您。也就是说,我首先通过简单地查看Debian包来学习Debian打包的基础知识。获取相似的源代码并通过示例学习。在以下是您的基本源程序包布…

python顺序结构实验报告_Python 数据结构 之 串 的顺序存储结构

本文所采用的数据结构模板为 《数据结构教程》C语言版,李春葆、尹为民等著。改篇所涉及到的是 串 的顺序存储结构。用Python仿照C语言来实现。代码地址:串 的顺序存储结构:# !/usr/bin/env python# -*- coding: utf-8 -*-__author__ MrHero""…

java五子棋源代码_java 五子棋游戏源码

【实例简介】【实例截图】【核心代码】package game;import java.applet.Applet;import java.applet.AudioClip;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Container;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.even…

java界面化_java怎么实现图形化界面

展开全部java图形化界面还62616964757a686964616fe78988e69d8331333363373232是有很多内容要学习的,可以参考 如下实例:public class Test extends JFrame{MyPanel mpnull;public static void main(String[] args){// TODO Auto-generated method stubTe…

java图形用户登录界面_Java简单登录图形界面

一.登录界面1.程序代码1 import java.awt.*;//导入awt包2 import javax.swing.*;//导入swing包3 import java.awt.event.ActionListener;//导入awt包中的监听器事件包4 import java.awt.event.ActionEvent;//导入awt包中的ActionEvent事件包56 public class EnterScreen extend…

北大青鸟java y2_Struts-2 北大青鸟 Y2学年 项目案例使用 2框架开发租房网站 Java Develop 249万源代码下载- www.pudn.com...

文件名称: Struts-2下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 10225 KB上传时间: 2016-01-03下载次数: 0提 供 者: 姜鹏详细说明:北大青鸟 Y2学年 项目案例使用Struts 2框架开发租房网站-My English LOW文件列表(点击判断是否您需要的文件&#xff0c…

java int 包_int readInt()

int readInt()描述 (Description)java.io.ObjectInputStream.readInt()方法读取32位int。声明 (Declaration)以下是java.io.ObjectInputStream.readInt()方法的声明。public int readInt()参数 (Parameters)NA返回值 (Return Value)此方法不返回值。异常 (Exception)EOFExcepti…

java i o是什么流_Java I/O流的总结

I/O的类结构图I/O的分类根据处理的数据类型分为:字节流和字符流。根据数据流向分为:输入流和输出流。流又可分为节点流和处理流。节点流直接与数据源相连处理流与节点流一起使用,在节点流的基础上,再嵌套一层。提高文件的读取效率…

java i18n实例_Java国际化(i18n)格式化日期

本篇文章帮大家学习java国际化(i18n)格式化日期,包含了Java国际化(i18n)格式化日期使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。DateFormat类提供了各种格式来格式化日期。 以下是一些格式的列表。DateForma…

java placeholder_java – 如何在JTextfield中设置像Placeholder一样的文本

我用来覆盖文本字段绘制方法,直到我最终得到更多的自定义文本字段然后我真的想…然后我发现this prompt API易于使用,不需要你扩展任何组件.它还有一个很好的“伙伴”API这已经被包含在SwingLabs,SwingX library中,这使得它甚至可以使用……例如(这使用SwingX-1.6.4)import jav…

java web聊天室私聊map_java websocket聊天室示例(springboot)

【实例简介】【实例截图】【核心代码】package com.example.demo;import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.ConcurrentHashMap;import javax.websocket.OnClose;import …

Java 内存映射读取文件_Java内存映射 大文件轻松处理|chu

前言内存映射文件(Memory-mapped File),指的是将一段虚拟内存逐字节映射于一个文件,使得应用程序处理文件如同访问主内存(但在真正使用到这些数据前却不会消耗物理内存,也不会有读写磁盘的操作),这要比直接文件读写快几个数量级。…

LeetCode - Easy - 118. Pascal‘s Triangle

Topic Array Description https://leetcode.com/problems/pascals-triangle/ Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it. Example…

LeetCode - Easy - 119. Pascal‘s Triangle II

Topic Array Description https://leetcode.com/problems/pascals-triangle-ii/ Given an integer rowIndex, return the rowIndexth row of the Pascal’s triangle. Notice that the row index starts from 0. In Pascal’s triangle, each number is the sum of the tw…

jenv java_mac 上使用jenv 管理的多个java 版本

由于服务器是java1.7, mac上是1.8,因此mac编译的java代码会在服务器上报错。因此,需要修改mac上java版本,自己折腾了很久,放弃,决定使用jenv 管理! 结果是非常方便使用步骤:1、安装 …

mysql 源码 缓存_MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制

前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢…

如何单元测试Java的private方法

问题 Java类中private方法通常只能被其所属类的调用,其他类只能望而却步,单元测试private方法也就一筹莫展。 尝试解法: 在测试时,手动将private改为public,测试完后再将其改回。将测试方法写进private方法的所属类…

图论与java_算法笔记_150:图论之双连通及桥的应用(Java)

1 问题描述DescriptionIn order to get from one of the F (1 < F < 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often bein…

如何用JUnit单元测试List

问题 JUnit测试List时差强人意。 解法 引入依赖 hamcrest-library包含许多有用方法来测试List数据类型。 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>&l…