mysql知識點歸納 鎖(死鎖)

2022-09-07 08:48:12 字數 958 閱讀 7470

願歷盡千帆,歸來仍是少年

所遇問題:

場景:create table `user_item` (

`id` bigint(20) not null,

`user_id` bigint(20) not null,

`item_id` bigint(20) not null,

`status` tinyint(4) not null,

primary key (`id`),

key `idx_1` (`user_id`,`item_id`,`status`)

) engine=innodb default charset=utf-8

update user_item set status=1 where user_id=? and item_id=?

由於用到了非主鍵索引,首先需要獲取idx_1上的行級鎖

緊接著根據主鍵進行更新,所以需要獲取主鍵上的行級鎖;

更新完畢後,提交,並釋放所有鎖。

//如果在步驟1和2之間突然插入一條語句:

update user_item .....where id=? and user_id=?

//這條語句會先鎖住主鍵索引,然後鎖住idx_1。

//蛋疼的情況出現了,一條語句獲取了idx_1上的鎖,等待主鍵索引上的鎖;

//另一條語句獲取了主鍵上的鎖,等待idx_1上的鎖,這樣就出現了死鎖。

解決方案:

//1.先獲取需要更新的記錄的主鍵

select id from user_item where user_id=? and item_id=?

//2. 逐條更新

。。。思考:

迴圈批量更新很容易死鎖,假如本次更新需要操作100條資料,然後你逐條更新,更新到第90條資料,然後這個時候第91條資料被其他執行緒更新了,然後你等著釋放,這個執行緒要改的下條資料正好是你這90條已經改了的資料,所以他也等待,就產生了死鎖。

mysql知識點歸納 事務篇

願歷盡千帆,歸來仍是少年 簡述何為事務 控制資料的一致性。檢視當前資料庫事務隔離級別 select tx isolation 查詢超過60s的事務 select from information schema.innodb trx where time to sec timediff now trx...

集合知識點歸納

集合 定義 長度可變的 儲存物件的容器 特點 長度可變,只能用來儲存引用型變數 list介面 有序的,允許重複的 實現類 arraylist 底層維護陣列,執行緒不安全的,高效的,查詢快,增刪慢 linklist 底層維護鍊錶,能夠模仿佇列結構,增刪快 查詢慢 堆疊特點 先進後出 push 將元素壓...

XSS知識點歸納

xss攻擊指通過html注入篡改網頁,插入惡意的指令碼,當使用者瀏覽網頁的時候,控制瀏覽器。xss攻擊成功後,攻擊者能夠對使用者當前的瀏覽頁面植入惡意指令碼,通過惡意指令碼,控制使用者的瀏覽器,這些完成各種具體功能的惡意指令碼,成為xss payload 實質上就是js指令碼,任何js指令碼能實現的...