## 內存鎖與內存事務 - 劉小兵2014
內存鎖是語言的失敗。
DBMS使用事務封裝了鎖。內存事務卻在微軟那里不了了之。原因竟然是沒有發現對它的殺手級應用。
什么是殺手級應用?
現在的語言中,幾乎全部都存在著各式不同的封鎖元素。包括語言級的與庫級的。特別是那些所謂面向對象的語言。原因一方面是面向對象的程序中存在大量的數據共享,另一方面則是現代計算機的快速發展導致的多線程并發模式的大量應用(或者說“普及”)。
在JDon中發現幾篇文章說數據庫已死。我完全同意這種觀點。但是我們不能讓數據庫就這么死去,因為它發展了那么多年,有很多值得借鑒的東西很值得保存下來或者說特性移植。面向對象的系統在內存中沒錯,但在內存中的對象與位于數據庫中的對象并沒有本質的區別,它們都是數據。所以在DBMS中對數據進行管理的一整套東西其實都可以照原樣搬過來。
微軟之所以沒在內存事務中發現殺手級應用,很可能是因為他們自己的程序很多都是面向過程的,這樣的話當然很難發現殺手級應用了。
事務的價值在于它從輸出的角度對鎖機制進行了封裝,避免了在應用開發中很難處理或管理的死鎖,粒度控制等東西。因為這些東西直接影響運行時,本來就是應該被從,至少從用戶代碼的層次拿掉的。用戶怎么能直接“指揮”運行時呢?用戶對運行時的直接“干預”,很多時候是造成系統崩潰的原因。內存指針就是一個例子。不過值得慶幸的是,它已經在JAVA中拿掉(為什么不在當時一起拿掉同步呢?有困難嗎?)。
關于并發控制,我認為程序員的唯一職責應該是“定義事務”,不是更多。任何更多的職責都違背了程序語義學的觀點:語言是為我服務的。而關于并發則**只有“事務”才是在這種服務協議中應該出現的東西。**
回到現實。
對應四種ACID問題:更新失敗,臟讀,不可重復讀,幻影讀,有四種事務隔離級別:Read uncommitted, Read committed, Repeatable Read, Serializable。四種隔離級別分別采用四種封鎖(協議)實現:X鎖,X鎖+單次S鎖,X鎖+事務級S鎖,范圍鎖。
鎖有更復雜的實現如更新鎖,意向鎖,樂觀鎖,悲觀鎖,輕量級鎖,偏向鎖,自旋鎖等等,都是針對不同的需求特征或事務等級定制的鎖。事實上,這里面的很多只是使用了鎖的名字,所以其實并不是鎖,因為它們沒有起到排它的作用如自旋鎖,輕量級鎖,偏向鎖等等其實都不是鎖。特別是樂觀鎖,卻是通過不鎖來達到鎖的效果。
另一方面,根據被封鎖的對象的大小,又可以被分為行鎖,表鎖,頁鎖,或其它范圍鎖,特別是對于內存數據,根據內存數據的結構與層次,鎖的種類其實無限多。但是在真正的開發工作中只要找到合適粒度的對象就可以了,不必過于較真。
對應于以數據庫為中心的系統和以內存為中心的系統,鎖又可以分為內存鎖與數據庫鎖。數據庫鎖在大部分時候并不會被程序員直接使用因為上面包了一層事務。而在以內存為中心的系統中,java 1.5以后就提供了很多的封鎖類與原子操作可以被利用。特別是在1.6以后的鎖優化,基本上排除了在發現真正的沖突以前的封鎖開銷。這些鎖機制與API,加上原來就存在的語言級元素如synchronized和volatile,是采用真正的面向對象編程時必不可少的一部分。
這意味著如果要在項目中啟用OO的范式進行系統開發,則對程序員的要求其實非常高。因為對上面所述這些鎖機制的深刻理解,不是一個初入者可以很容易搞明白的東西。大部分的程序員都必須在碰了很多釘子以后才可能真正學會一些東西。
這里當然也有語言級的問題。如一些程序語義派的研究者的認為那樣,語言的元素應該指代的是語言的執行結果,而不是運行時特性。將語言元素指向運行時特性產生很多問題,第一就是造成程序對運行時的依賴,因為程序顯然依賴于語言的具體語義。事實上,程序的語義承載能力即來自于語言的語義承載能力。俗語水能載舟亦能覆舟是一樣的道理。另一個問題則是程序語義的丟失。將一個語言元素的語義指向運行時的后果是,它沒有被指向“運行后”的結果。在運行時中給語法元素賦值(即賦予語法元素一定的語義)是一種推脫責任的行為。這就好象指著未完工的產品對客戶說:這就是你要的東西!
我其實認為程序員的知識重點是應該擺在建模上面。但是世界并不完美,我們卻要工作。這就要求我們不得不擁有一些應付這個不完美世界的能力。換一句話,如果世界已經是完美的,為什么我們還需要工作呢?我們還要繼續努力,因為世界還不完美(這個有點象悖論,,,因為它看上去好象是我們工作的目的是為了讓世界更完美,但是事實卻是世界從沒有變得“更”完美或永遠也不可能完美。。。歸根結底,我們并不是世界。我們也不存在。真正存在的從頭到尾只不過是一些雄激素而已。我們以為我們存在,只不過雄激素讓我們以為我們存在然后我們便可以成為我們)。
http://www.jdon.com/oo.html, uml
? 著作權歸作者所有
分類:Stock 字數:1688
### 轉自
[內存鎖與內存事務 - 劉小兵2014](https://my.oschina.net/digerl/blog/34001#tt_daymode=1)
last update:2017-6-29 21:00:28
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 科目一
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南