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.pswp.cn/news/445813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445813.shtml
英文地址,請注明出處:http://en.pswp.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…