多事務併發更新同一字段,引入鎖

2021-10-06 08:29:41 字數 1448 閱讀 7890

總結注意下面的例子:

事務1事務2

begin;

begin;

select data from test where id = 1;

得到 ab

select data from test where id = 1;

得到 ab

update test set data = 『cb』 where id = 1;

update test set data = 『ad』 where id = 1;

等待事務1

commit;

等待事務1

commit;

select data from test where id = 1;

得到 ad

看到什麼問題沒?顯然,事務1的更改被覆蓋了。

當我們要對錶中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發。這種借助資料庫鎖機制,先鎖定再修改的方式被稱為悲觀併發控制(又名「悲觀鎖」,pessimistic concurrency control,縮寫「pcc」)。

舉例如下:

事務1事務2

begin;

begin;

select data from test where id = 1 for update;

得到 ab

select data from test where id = 1 for update;

等待事務1

update test set data = 『cb』 where id = 1;

等待事務1

等待事務1

commit;

等待事務1

得到 cb

樂觀鎖是相對悲觀鎖而言的,樂觀鎖假設資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則返回給使用者錯誤的資訊,讓使用者決定如何去做。樂觀鎖不會刻意使用資料庫本身的鎖機制,而是依據資料本身來保證資料的正確性。

舉例如下:

事務1事務2

begin;

begin;

select data from test where id = 1;

得到 ab

select data from test where id = 1;

得到 ab

update test set data = 『cb』 where id = 1 and data = 『ab』;

update test set data = 『ad』 where id = 1 and data = 『ab』;

等待事務1

commit;

等待事務1

commit;

select data from test where id = 1;

得到 cb

顯然,事務1更新成功,事務2實際上是更新失敗的,可以嘗試再次更新。

Mysql 同一欄位多值模糊查詢

同一欄位多值模糊查詢,使用多個or進行鏈結,效率不高,但沒有更好的解決方案。有看到charindex 關鍵字,可查詢結果並不是模糊,舉個栗子 例如select from table where charindex name 張三,李四 0 二 同一值多字段模糊查詢,使用concat關鍵字,舉個栗子 ...

同一欄位多ID儲存名稱對映

在資料庫設計時,為了減少表儲存的記錄數,對於1對多的關係可以儲存在同乙個記錄中,例如某乙個應用會被多個人使用,有一種儲存方法如下 這樣會造成記錄數會越來越多,還有一種方法可以用2條記錄儲存上述資料 第一種方法的好處就是顯示員工名稱非常方便,和員工資訊表關聯即可 第二種方法如果要顯示維護人員的姓名就非...

MySQL海量資料單一字段更新

昨天發了一篇mysql中索引對千萬級資料查詢效率優化實踐的博文 所以手上有著5000萬的資料,很多以前想做的實驗也有機會去嘗試了。今天上課突然想起來一篇資料庫的面試題。大概是說 某公司有一張億級的使用者表,使用者表有乙個積分字段。這個欄位會在每年新年凌晨0點的時候進行清零,要求給出解決的思路。大概記...