mysql for update用處_for update的作用和用法

一、for update定義

for update是一種行級鎖,又叫排它鎖,一旦用戶對某個行施加了行級加鎖,則該用戶可以查詢也可以更新被加鎖的數據行,其它用戶只能查詢但不能更新被加鎖的數據行.如果其它用戶想更新該表中的數據行,則也必須對該表施加行級鎖.即使多個用戶對一個表均使用了共享更新,但也不允許兩個事務同時對一個表進行更新,真正對表進行更新時,是以獨占方式鎖表,一直到提交或復原該事務為止。行鎖永遠是獨占方式鎖。

只有當出現如下之一的條件,才會釋放共享更新鎖:

1、執行提交(COMMIT)語句

2、退出數據庫(LOG OFF)

3、程序停止運行

二、概念和用法

通常情況下,select語句是不會對數據加鎖,妨礙影響其他的DML和DDL操作。同時,在多版本一致讀機制的支持下,select語句也不會被其他類型語句所阻礙。

而select … for update 語句是我們經常使用手工加鎖語句。在數據庫中執行select?…?for update ,大家會發現會對數據庫中的表或某些行數據進行鎖表,在mysql中,如果查詢條件帶有主鍵,會鎖行數據,如果沒有,會鎖表。

由于InnoDB預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執行Table?Lock (將整個資料表單給鎖住)。

舉個例子: 假設有張表user ,里面有 id 和 name 兩列,id是主鍵。

例1: (明確指定主鍵,并且數據真實存在,row lock)

SELECT * FROM user WHERE id=3 FOR UPDATE;SELECT * FROM user WHERE id=3 and name='Tom' FOR UPDATE;

例2: (明確指定主鍵,但數據不存在,無lock)

SELECT * FROM user WHERE id=0 FOR UPDATE;

例3: (主鍵不明確,table lock)

SELECT * FROM user WHERE id<>3 FOR UPDATE;SELECT * FROM user WHERE id LIKE '%3%' FOR UPDATE;

例4: (無主鍵,table lock)

SELECT * FROM user WHERE name='Tom' FOR UPDATE;

注意:

1、FOR UPDATE僅適用于InnoDB,且必須在事務處理模塊(BEGIN/COMMIT)中才能生效。

2、要測試鎖定的狀況,可以利用MySQL的Command Mode(命令模式) ,開兩個視窗來做測試。

3、Myisam 只支持表級鎖,InnerDB支持行級鎖 添加了(行級鎖/表級鎖)鎖的數據不能被其它事務再鎖定,也不被其它事務修改。是表級鎖時,不管是否查詢到記錄,都會鎖定表。

三、什么時候需要使用for update?

借助for update語句,我們可以在應用程序的層面手工實現數據加鎖保護操作。就是那些需要業務層面數據獨占時,可以考慮使用for update。

場景上,比如火車票訂票,在屏幕上顯示有票,而真正進行出票時,需要重新確定一下這個數據沒有被其他客戶端修改。所以,在這個確認過程中,可以使用for update。

四、for update悲觀鎖

悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它解鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。就像for update,再比如Java里面的同步原語synchronized關鍵字的實現也是悲觀鎖。

樂觀鎖:顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似于write_condition機制,其實都是提供的樂觀鎖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python大數據零基礎_零基礎學習大數據人工智能,學習路線篇!

大數據處理技術怎么學習呢?首先我們要學習Python語言和Linux操作系統&#xff0c;這兩個是學習大數據的基礎&#xff0c;學習的順序不分前后。Python&#xff1a;Python 的排名從去年開始就借助人工智能持續上升&#xff0c;現在它已經成為了語言排行第一名。從學習難易度來看…

python刪除文件和linux刪除文件區別_使用Python批量刪除文件列表

使用Python批量刪除文件列表環境&#xff1a;已知要刪除的文件列表&#xff0c;即確定哪些文件要刪除。代碼如下&#xff1a;#!/usr/bin/env python#codingutf-8#目的&#xff1a;本程序主要為刪除給定的文件列表import osimport shutil#引入模塊&#xff0c;os為包含普遍的操作…

華為python有必要學嗎_【華為云技術分享】這個 Python 庫有必要好好學學

這里看一個最基本的例子&#xff0c;這里給到一個 User 的 Class 定義&#xff0c;再給到一個 data 數據&#xff0c;像這樣&#xff1a;1 class User(object):2 def __init__(self, name, age):3 self.name name4 self.age age56 data [{7 name: Germey,8 age: 239 }, {10 nam…

python求平行四邊形面積_python 已知平行四邊形三個點,求第四個點的案例

我就廢話不多說了&#xff0c;大家還是直接看代碼吧&#xff01;import numpy as np#已知平行四邊形三個點&#xff0c;求第四個點#計算兩點之間的距離def CalcEuclideanDistance(point1,point2):vec1 np.array(point1)vec2 np.array(point2)distance np.linalg.norm(vec1 -…

eview面板數據之混合回歸模型_【視頻教程】Eviews系列25|面板數據回歸分析之Hausman檢驗及本章常見問題解答...

點擊上方關注我們!本期我們學習Eviews統計建模最后一部分--面板數據回歸分析Hausman檢驗及本章常見問題解答。實操&#xff1a;Hausman檢驗判斷是固定效應模型還是隨機效應模型上期我們講到模型判斷若選擇模型2,需進一步通過Hausman檢驗判斷固定效應還是隨機效應&#xff0c;接…

python打出由邊框包圍的_python opencv 圖像邊框(填充)添加及圖像混合的實現方法(末尾實現類似幻燈片漸變的效果)...

圖像邊框的實現圖像邊框設計的主要函數cv.copyMakeBorder()——實現邊框填充主要參數如下&#xff1a;參數一&#xff1a;源圖像——如&#xff1a;讀取的img參數二——參數五分別是&#xff1a;上下左右邊的寬度——單位&#xff1a;像素參數六&#xff1a;邊框類型&#xff1…

mysql5.7.21備份腳本_Shell腳本使用匯總整理——mysql數據庫5.7.8以后備份腳本

#!/bin/sh#db_backups_conf.txt文件路徑db_backups_conf"/wocloud/shell/db_backups_conf.txt"#判斷文件是否存在if [ -f "${db_backups_conf}" ];thenecho $(date %Y-%m-%d %H:%M:%S)" 數據庫配置信息文件存在&#xff0c;開始進行數據備份"#獲…

python嵌套列表操作_python基礎(list列表的操作,公共方法,列表嵌套,元祖)...

list 列表索引&#xff0c;切片與str相同。列表的操作(增刪改查)1&#xff0c;增加.append()  追加&#xff0c;增加到最后li [alex,wusir,egon,女神,taibai]li.append(ppp)print(li).insert()  中間插入&#xff0c;通過索引li [alex,wusir,egon,女神,taibai]li.insert(…

mybatis mysql selectkey_Mybatis示例之SelectKey的應用

SelectKey在Mybatis中是為了解決Insert數據時不支持主鍵自動生成的問題&#xff0c;他可以很隨意的設置生成主鍵的方式。不管SelectKey有多好&#xff0c;盡量不要遇到這種情況吧&#xff0c;畢竟很麻煩。SelectKey需要注意order屬性&#xff0c;像Mysql一類支持自動增長類型的…

python程序設計上機實踐第三章答案_20192419 實驗三《Python程序設計》實驗報告

學號 2019-2020-2 《Python程序設計》實驗3報告課程&#xff1a;《Python程序設計》班級&#xff1a;1924姓名&#xff1a; 萬騰陽學號&#xff1a;20192419實驗教師&#xff1a;王志強實驗日期&#xff1a;2020年5月16日必修/選修&#xff1a; 公選課1.實驗內容創建服務端和客…

完成數獨的算法 python_python實現數獨算法實例

本文實例講述了python實現數獨算法的方法。分享給大家供大家參考。具體如下&#xff1a;# -*- coding: utf-8 -*-Created on 2012-10-5author: Administratorfrom collections import defaultdictimport itertoolsa [[ 0, 7, 0, 0, 0, 0, 0, 0, 0], #0[ 5, 0, 3, 0, 0, 6, 0, …

python讀取多個文件csv_Python:讀取多個文本文件并寫入相應的csv文件

我在別處找不到這個問題的答案&#xff0c;所以我將繼續把它貼在這里&#xff1a;我有一個Python腳本&#xff0c;它將讀取文本文件的內容&#xff0c;將其內容拆分為單詞&#xff0c;然后輸出一個CSV文件&#xff0c;該文件將文本縮減為單詞頻率列表。(最后&#xff0c;我將插…

java treetable_在Swing中創建TreeTable | 學步園

TreeTable是Tree和Table的一個結合&#xff0d;就是一個即能夠展開和收起行&#xff0c;同時也能夠顯示多個列的組件。在Swing的標準包里沒有一個叫做JtreeTable的組件&#xff0c;但是我們很容易通過把Jtree做成Jtable的渲染器來創建一個這樣的組件。這篇文章就是關于如何使用…

python爬去微博十大流行語_用python重新定義【2019十大網絡流行語】-后臺/架構/數據庫-敏捷大拇指-一個敢保留真話的IT精英社區...

↑關注 置頂 ~ 有趣的不像個技術號52568040f9313098ffa367d9d9d21437.jpg (5.73 KB, 下載次數: 0)2019-12-10 04:43 上傳3f4d5fe0016d011a7a68af763314befd.jpg (1.06 KB, 下載次數: 0)2019-12-10 04:43 上傳“文明互鑒真硬核&#xff0c;融梗檸檬誰覺得。霸凌第一九九六&…

java中怎么獲取配置文件的值_java如何獲取配置文件的值

轉&#xff1a;原創 編碼小王子 發布于2018-10-11 18:07:52 閱讀數 2722 收藏展開java大型項目中都會很多系統常量,比如說數據庫的賬號和密碼,以及各種token值等,都需要統一的管理,如果零落的散布到各個類等具體的代碼中的話,在后期管理上將是一場災難,所有需要對這些變量進行統…

python實現隊列_用Python實現的數據結構與算法:隊列

一、概述隊列(Queue)是一種先進先出(FIFO)的線性數據結構&#xff0c;插入操作在隊尾(rear)進行&#xff0c;刪除操作在隊首(front)進行。二、ADT隊列ADT(抽象數據類型)一般提供以下接口&#xff1a;Queue() 創建隊列enqueue(item) 向隊尾插入項dequeue() 返回隊首的項&#xf…

java 監聽窗口是否改變_JAVA項目監聽文件是否發生變化

一.spring容器都初始化完成之后做操作packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.s…

笨辦法學python3 pdf 腳本之家_解決python3輸入的坑——input()

如下所示&#xff1a;a,b,c,d input()很簡單的代碼&#xff0c;如果輸入為1 -1 -2 3結果會報錯&#xff0c;原因在于input函數會將你的輸入作為python腳本運行&#xff0c;那么輸入就變成了1-1 -2 3&#xff0c;即0 -2 3結果當然是錯誤的了&#xff0c;解決辦法就是將輸入用引…

java 數組寫法_java書寫、數據類型、數組定義

這里只記錄java與php、javascript不同的地方&#xff0c;相同的地方就不贅述了。1.java文件源碼為以.java為后綴的文件&#xff0c;字節碼文件是以.class為后綴的文件。2.寫好一個java源碼之后&#xff0c;cmd進入源碼文件盤符&#xff0c;用命令 javac helloworld.java將源碼轉…

python爬蟲高級知識點_Python爬蟲知識點梳理總結,殿堂級小白入門必讀

數據分析是任何技術一樣。你應該學習的目標。目標就像燈塔,指引你前進。我見過很多合作伙伴學習學習,然后學會放棄。事實上,很大一部分原因是沒有明確的目標,所以你必須清楚學習的目的。你準備學習爬行之前,問問你自己為什么你想學爬行。有些人為了工作,一些為了好玩,和做一定黑…