1. 行鎖
給某一行記錄上鎖,目前只有InnoDB引擎支持行鎖
2. 表鎖
給一個整張表上鎖
3. 樂觀鎖
本身很樂觀,認為在操作數據時(更新操作),默認別的線程并不會操作數據發生沖突,所以在每次操作時并不會上鎖,只是在更新時判斷別的線程在此期間是否有做修改,如果有修改該操作就無效
通常實現是這樣的:在表中的數據進行操作時(更新),先給數據行加一個版本(version)字段,每操作一次,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version字段,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,將version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。
~~~
#1.查詢出商品信息
select (status,status,version) from t_goods where id=#{id}
#2.修改商品status為2
set status=2,version=version+1 where id=#{id} and version=#{version};
~~~
4. 悲觀鎖
(大多數情況下依靠數據庫的鎖機制實現,開銷比較大)
本身很悲觀,認為在操作數據時總會發生沖突,所以在每次操作時都需要給相應的數據加上鎖來避免沖突,所以悲觀鎖比較耗時,另外與樂觀鎖不同悲觀鎖是由數據庫自己實現的,所以要用的時候可以直接調用數據庫的相關語句.
共享鎖和排他鎖是悲觀鎖的不同實現,但都屬于悲觀鎖
* 共享鎖(lock in share mode)
共享鎖又稱讀鎖,一個線程給數據加上共享鎖之后,其他線程只能讀數據不能修改數據
* 排他鎖(for update)
排他鎖又稱寫鎖,跟共享鎖的區別是,其他線程既不能讀也不能寫數據
作者:小新是個程序媛
鏈接:https://www.jianshu.com/p/ddfa9cd5f605
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
- 前言
- 函數參考
- Socket 函數
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔術方法
- 魔術常量
- 雜項
- backlog的用處
- new self()和new static()的區別
- PHP變量的生命周期
- PHP抽象類
- 對象接口
- PHP中的常用關鍵字
- 常量
- 內存泄露
- global 與 $GLOBAL
- 簡單說明CGI和動態請求是什么
- 設計模式
- 單例模式
- 工廠模式
- 適配器模式
- 策略模式
- 觀察者模式
- 控制反轉IoC簡介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面試
- 數據庫相關
- 語句相關
- 索引相關
- 字段相關
- PHP相關
- 字符串相關
- 函數相關
- 運算符優先級相關
- 錯誤相關
- redis相關
- 10個常見的Redis面試"刁難"問題
- mysql
- MySQL中的鎖
- MySQL存儲引擎MyISAM 和 InnoDB的區別
- MySQL半同步復制
- explain 命令詳解
- 索引
- 數據庫事務
- MySQL和B樹的那些事
- git
- github----向開源框架提交pr的過程
- 推薦博客
- linux
- 命令
- free
- 高并發
- 搶購/秒殺功能
- 算法
- 一致性Hash算法