1. 程式人生 > >業務需求:資料庫如何保證先查詢後插入/更新 原子性?

業務需求:資料庫如何保證先查詢後插入/更新 原子性?

一、業務需求:

當操作積分使用者表時,如果accountId在表中沒有資料,那麼我們新增一條資料,設定使用者積分。如果accountId在表中有資料,我們需要更新使用者積分。   這個操作簡單來說就是:    在單執行緒下 我們先查詢後處理當然沒有問題,但是在併發下問題就顯而易見了,系統裡可能同時插入兩條一樣的accountId資料。    

二、問題解決:

 

解決方式一: ON DUPLICATE KEY UPDATE

資料庫中account_id設定唯一索引,當發現account__id已經存在時,會執行update操作,不存在時會執行insert操作。 一行sql語句就能完成兩種操作,保證了原子性。   sql語句如下:
  新增單元測試,檢視耗時以及查驗資料庫在併發下資料是否正確。 程式碼隱去業務程式碼,如下:

相關推薦

業務需求資料庫如何保證查詢插入/更新 原子

一、業務需求: 當操作積分使用者表時,如果accountId在表中沒有資料,那麼我們新增一條資料,設定使用者積分。如果accountId在表中有資料,我們需要更新使用者積分。   這個操作簡單來說就是:    在單執行緒下 我們先查詢後處理當然沒有問題,

Qt5.9Creator讀寫Mysql5.7.17資料庫詳細例子(資料庫基本操作建立表,查詢插入,刪除,修改)

本文章主要總結的內容是用Qt5.9Creator工程讀寫Mysql5.7.17資料庫。具體的操作步驟如下所述。   一、用Qt5.9的Creator建立一個Console工程,選擇MinGW32編譯器。   二、新增程式碼 2.1建立好工程後,在.pro檔案裡

牛客資料庫實戰—2—查詢各個部門當前(to_date='9999-01-01')領導當前薪水詳情以及其對應部門編號dept_no

CREATE TABLE `dept_manager` ( `dept_no` char(4) NOT NULL, `emp_no` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (

牛客資料庫實戰---1---查詢最晚入職員工的所有資訊、查詢入職員工時間排名倒數第三的員工所有資訊

1、查詢最晚入職員工的所有資訊 CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` var

C#系列——記一次業務需求物件的深拷貝

  這篇隨筆著實在意料之外,主要是源於上週開發BS的一個業務,需要用到物件的深拷貝。說的直白一點,就是將物件記憶體分配區和引用完全拷貝一份新的。這種需求以前就遇到過,怎麼解決的已經記不清了。這次趁著這個機會將物件的深拷貝這個知識點記錄下。   先來說說業務場景,直接上程式碼:        //0.反

基於EasyNVR二次開發實現業務需求使用者、許可權、裝置管理

許多接觸到EasyNVR的使用者、開發者都會提出關於EasyNVR裝置分組和賬戶裝置關係對映的問題,我們參考目前大部分的視訊能力輸出平臺的做法,EasyNVR目前只做了唯一的使用者/密碼(類比appkey/secretkey)管理,應用層呼叫EasyNVR

一次線上故障資料庫連線池洩露的思考

 一:初步排查 早上作為能效平臺系統的使用高峰期,系統負載通常比其它時間段更大一些,某個時間段會有大量使用者登入。當天系統開始有使用者報障,釋出系統線上無法構建釋出,然後後續有使用者不能登入系統,系統發生假死,當然系統不是真的宕機,而是所有和資料庫有關的連線都被阻塞,隨後檢視日誌發現有大量報錯。 和

Java連線資料庫完整程式碼 查詢插入

package test; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedState

實驗三 資料庫多表查詢、資料更新、檢視

實驗內容1、基於Student_DB資料庫中的三個表Student,Course,SC,進行如下的查詢:(1) 查詢每個學生及其選修課情況(使用自然連線)。select student.*,SC.* f

mysql刪除插入導致死鎖

cti 插入語 adl err values 並不是 trying error 問題 所報的錯誤為:pymysql.err.OperationalError: (1213, ‘Deadlock found when trying to get lock; try resta

SQL多表聯合查詢實現插入/更新/刪除

具體描述:有兩個表相關聯,比如A是主表,B是A的關聯從表。A和B各自的主鍵都是自動增長的。 所以插入順序:先插入A,再插入B;        更新順序:隨意;        刪除順序:先刪除B,再刪除A; 1、刪除B時的聯合查詢語句如下 delete B from B,

SQL從一個表查詢資料插入/更新到另一個表

在應用中我們可能會遇到一些資料匯入操作,如從一個表查詢出資料插入到另外一個表,或從一個表查詢出資料更新到另外一個表,這些操作一般都是一次性操作,針對一次性操作,效率只是第二位,第一位的是功能實現。這個操作既可以用於同一個資料庫不同表之間,也可以用於不同資料庫不同

實際工作場景中踩過redis的一個坑查詢redis,而查詢資料庫問題

      今天,在工作中遇到專案在查詢碼錶字典轉換時,不走redis而是查詢後臺資料庫問題。做一個簡單記錄,目的是防止以後出現類似問題,同時該碼錶存在快取中採用的資料型別也是值得我學習的。 一、簡單的背景介紹       該專案以

源碼解析init-method、@PostConstruct、afterPropertiesSet孰

tro strong proc blog tor after stc ini 解析 http://sexycoding.iteye.com/blog/1046993 @PostConstruct註解後的方法在BeanPostProcessor前置處理器中就被執行了,所以當然

優先順序PKJava中的4種程式碼塊,誰

問題:Java裡的四種程式碼塊,像積木一般搭成程式碼塔。那麼一段複雜的程式碼在JVM裡每一句的執行順序是如何的呢? 思路:看程式碼塊的優先順序順序——>被呼叫的順序 答:要回答這個問題,我們先來看看四種程式碼塊是哪些: 有了定義,還是要具體例子的: public cl

jmeter JDBC Request (查詢資料庫獲取資料庫資料) 的使用

以mysql資料庫為例  需準備的:資料庫的使用者名稱為root(你自己的使用者名稱),使用者名稱密碼為*********(你自己的密碼) 1,配置 JDBC Connection Configuration 重要引數說明: Variable Name:資料庫

Python列表中按某一列作為索引查詢其他列表中對應資訊,找到插入當前列表。

直接複製,修改地址後使用。修改三個位置,如備註。 #coding=utf-8 import os.path import numpy as np if __name__=="__main__":  list_1_txt= open('list1.txt')#這裡,讀取第一個列表 &

關於hibernate查詢的物件,set更新資料庫的原因

關於hibernate查詢後的物件,set後,更新資料庫的原因 2018年03月29日 20:18:49 夜影鬼手 閱讀數:370更多 個人分類: hibernate 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.

hibernate創建本地查詢進行查詢的時候報錯 could not execute query;列名無效

遇到 註解 ransient 映射類 日誌信息 數據 字段 數據庫 get 今天在走數據下發的時候遇到了一個問題: 創建一個sql語句(sql語句很簡單) 創建了一個本地查詢,執行這個sql語句 結果報錯:could not execute query;列名無效 先檢查數據

趣談網路協議---TCP協議惡而複雜,善反輕鬆

TCP包頭格式 序號解決包的亂序問題。 確認序號確認對方收到,沒有收到則重新發送。 狀態位維護連線的狀態。SYN發起連線,ACK回覆,RST重新連線,FIN結束連線。 視窗大小用於流量控制。 TCP三次握手 為什麼是3次握手? 1、為了防止已失效的連線請