mysql數據庫老是被鎖怎么解決_Mysql數據庫全局鎖是如何引起的,如何解決?

2019-01-08 回答

樂觀鎖與悲觀鎖不同的是,它是一種邏輯上的鎖,而不需要數據庫提供鎖機制來支持

當數據很重要,回滾或重試一次需要很大的開銷時,需要保證操作的acid性質,此時應該采用悲觀鎖

而當數據對即時的一致性要求不高,重試一次不太影響整體性能時,可以采用樂觀鎖來保證最終一致性,同時有利于提高并發性

通常,樂觀鎖采用版本號/時間戳的形式實現:給數據額外增加一個版本號字段進行控制;更新時,若提交的數據所帶的版本號與當前記錄的版本號一致,則允許變更執行并更新版本號;若不一致,則意味著產生沖突,根據業務需求直接丟棄并返回失敗,或者嘗試合并

在mysql的實踐中,常見的一種使用樂觀鎖的方法,是在需要使用樂觀鎖的表中,新增一個version字段

例如:

create table product_amount (

id int not null primary key auto_increment,

product_name varchar(64) not null,

selling_amount int not null,

storing_amount int not null,

version int not null

);

當需要更新銷售中的商品數量(selling_amount)時,使用如下的sql語句:

update product_amount set selling_amount = #{selling_amount}, version = #{new_version} where id=#{id} and version = #{old_version};

若該語句返回1,則表示更新成功;若返回0,則表示前后的version不一致,產生沖突,更新失敗

對于更新倉庫中的商品數據(storing_amount)時,也是同理

不過,這樣為每行記錄都統一設置一個version字段的樂觀鎖方式,存在一個問題:上例中,如果同時需要單獨對selling_amount及storing_amount進行update(兩條sql語句分別單獨執行),那么后執行的一條會因為先執行的一條更新了version字段而失敗,而這種失敗顯然是沒有必要的,白白浪費了開銷

一種比較好的方式是為每個需要樂觀鎖的字段單獨設置版本號,例如對上例的改造:

create table product_amount (

id int not null primary key auto_increment,

product_name varchar(64) not null,

selling_amount int not null,

selling_version int not null,

storing_amount int not null,

storing_version int not null

);

selling_amount和storing_amount分別擁有自己的樂觀鎖版本號(selling_version和storing_version),更新時分別只關注自己的版本號,這樣就不會因為版本號被其它字段修改而失敗,提高了并發性

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

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

相關文章

我們邊吃曲奇邊聊——Cookie與Session那些事

Cookie與Session分別是什么? HTTP Cookie(也叫 Web Cookie 或瀏覽器 Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。 通常,它用于告知…

mysql 不能添加外鍵 1215_MySQL錯誤1215:無法添加外鍵約束

我正在嘗試將新模式轉發工程到我的數據庫服務器上,但是我不知道為什么會收到此錯誤。我試圖在這里搜索答案,但是我發現的所有內容都說是將db引擎設置為Innodb或確保要用作外鍵的鍵是它們自己表中的主鍵。如果我沒記錯的話,我都做過這兩件事。…

JMH初體驗

什么是JMH JMH是 Java Microbenchmark Harness 的縮寫。中文意思大致是 “JAVA 微基準測試套件”。 基準測試是指通過設計科學的測試方法、測試工具和測試系統,實現對一類測試對象的某項性能指標進行定量的和可對比的測試。——百度百科 為什么要使用 JMH 基準測試…

java map取第一個元素_Java Set接口 Map 與枚舉

Set接口概述一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,并且最多包含一個 null 元素特點Set接口是無序的 Set 是繼承于Collection的接口。它是一個不允許有重復元素的集合。Set可以存儲null值,但是nu…

Python中yield簡單用法

Python中yield簡單用法 你或許知道帶有yield的函數在Python中被稱之為generator,那何為 generator? 我們暫時拋開generator,先從一個常見編程題目開始,循序漸進了解yield的概念。 生成Fibonacci數列 Fibonacci數列是一個經典遞…

js 用下標獲取map值_js map方法處理返回數據,獲取指定數據簡寫方法

map方法處理返回數據,獲取指定數據簡寫方法前言后端返回數據為數組列表時,通常比較全面,包含了很多不需要的數據,可以通過 map 方法處理返回數據,篩選出想要的數據例如// 返回數據res [{id: 1,name: zhangsan,age: 16…

《Python Cookbook 3rd》筆記匯總

文章目錄一、數據結構二、字符串和文本三、數字、日期和時間四、迭代器與生成器五、文件與IO一、數據結構 標題關鍵詞1.1:拆分序列后賦值給多個變量可迭代對象、拆分賦值1.2:拆分任意長可迭代對象后賦值給多個變量可迭代對象、拆分賦值、星號表達式1.3&…

mysql hp ux_hp ux apa 切換

(HP-UX Only) OR - 1 heartbeat network using APA with 2 trunk members (HP-UX Only) OR - 1 heartbeat network with serial line (HP-UX Only) OR......一、 概述 HP 的 APA 軟件提供兩種網卡冗余切換模式,用以實現網絡高可用性...0x000000000000 hp_apa HP-UX 11i v3 Prer…

Python中[:]與[::]的用法

Python中[:]與[::]的用法 概述 [:]與[::]語法是通用序列操作(Common Sequence Operations)其中的兩個。用[:]或[::]對多數序列類型(可變的或不可變的)(如字符串、列表等)序列中元素進行截取。 [:]的用法…

mysql redis 中間件_Docker快速搭建Mysql社區版,Redis,MongoDb、MQ等等中間件。

一:安裝docker社區版。Centos系列(最好用7以上的版本,docker需要3.1以上的linux內核版本)sudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl start dockersudo docker run hello-world如果你敲docker info需要root密碼,…

JavaScript中String的slice(),substr(),substring()三者區別

JavaScript中String的slice(),substr(),substring()三者區別 共同之處 從給定的字符串中截取片段,并返回全新的這片段的字符串對象,且不會改動原字符串。 具體不同之處 slice() str.slice(beginIndex[, endIndex])參數描述be…

pythontuple數據類型_數據類型-元組Tuple

Python Tuple用于存儲不可變python對象的序列。元組類似于列表,因為可以改變列表中存儲的項的值,而元組是不可變的,并且不能改變存儲在元組中的項的值。元組可以寫成用小括號括起來的逗號分隔值的集合。元組可以定義如下。T1 (101, "Ay…

《劍指Offer》24:反轉鏈表

題目 定義一個函數,輸入一個鏈表的頭節點,反轉鏈表并輸出反轉后鏈表的頭節點。鏈表節點定義如下: public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 方法一&#xff1…

python兩個for循環為什么第二個循環里值不變_兩個for循環,第二個只在第一個迭代python上執行...

我是一個pythonnoob,我試圖比較兩個文件中的行之間的值,如果行在第二個文件中,則輸出“line name”,然后輸出1;如果第二個文件中缺少該行,則輸出0。第一次迭代返回1,因為該行在第二個文件中&…

python如何問問題_學會正確的提問

可能很多讀者看到這個標題會感覺很可笑,提問誰不會啊,互聯網時代,提問還不是一句話的事情?個人、技術群、論壇里都可以提問啊,「你好」「在嗎?」「有人用過 xx 工具嗎?」。首先,提問…

如何保證接口的冪等性

如何保證接口的冪等性 什么是冪等性 冪等性是系統服務對外一種承諾,承諾只要調用接口成功,外部多次調用對系統的影響是一致的。聲明為冪等的服務會認為外部調用失敗是常態,并且失敗之后必然會有重試。 通俗地說,接口冪等性就是…

mysql二進制方式_MySQL數據庫之MySql二進制連接方式詳解

本文主要向大家介紹了MySQL數據庫之MySql二進制連接方式詳解 ,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。使用mysql二進制方式連接您可以使用MySQL二進制方式進入到mysql命令提示符下來連接MySQL數據庫。實例以下是從命令行中連接my…

xposed模塊編寫教程_太極xposed模塊使用教程

今天給大家分享一下太極xposed模塊使用教程。很多小伙伴說下載不到Xposed模塊,這個網上其實很多,但是第三方的下載站就算了吧。我也是一個深受其害的網癮少年,只要是下載站的軟件,一不留心一次性電腦可能會多安裝好多個軟件&#…

如何使用mysql添加更新_Mysql 存在既更新,不存在就添加(sql語句)

討人喜歡的 MySQL replace into 用法(insert into 的增強版)在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。在 SQL Server 中可以這樣處理…

linux + nginx + mysql + php 百度網盤_5.LNMP(Linux + Nginx + MySQL + PHP)環境安裝

1.安裝Nginx:yum install yum-priorities -ywget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmrpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpmyum -y install nginxsystemctl start nginx.servicesystemctl stop ngin…