併發程式設計的原子性 != 事務ACID的原子性
關於原子性,很多人在多個地方都聽說過,大家也都背的很熟悉。
在事務的ACID中,有原子性的概念,在併發程式設計的原子性、可見性、有序性中也有原子性的概念。
有人認為他們是一樣的,甚至很多人在說原子性的時候也都是這麼說的:
原子性是指事務是一個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。
但是,其實,雖然都叫原子性,但是此原子性非彼原子性。
在資料庫中的原子性,確實是一個不可拆分的工作單元,要麼都執行,要麼都不執行。因為事務可以Commit、也可以Rollback。
但是在併發程式設計中,一個操作是沒辦法rollback的,並且執行緒在執行過程中也是有可能失敗的,失敗了是沒辦法回滾的,難道就說一個操作沒辦法保證原子性了麼?
所以,在併發程式設計中,我們把一個或者多個操作在 CPU 執行的過程中不被中斷的特性稱為原子性。這裡的原子性是透過加鎖的方式來保證的,其實保證的就是一系列操作,不可以被拆分執行,即執行過程中,需要互斥排他,不能有其他執行緒進行執行。
舉一個例子來說明一下這兩個原子性的區別。
Redis中的Lua指令碼到底能不能保證原子性?
網上很多文章,有人說能,有人說不能。要我說,都對,也都不對。就是因為因為大家搞混了這兩個原子性的區別。
我們都知道,當我們想要在一個事務中執行多個命令的時候,會選擇使用Lua指令碼。
Redis會將一個要執行的Lua指令碼封裝成一個單獨的事務,而指令碼執行器在執行這個事務的過程中,
如果有其他客戶端請求的時候,會把它暫存起來,等指令碼處理完以後,才會再把被暫存的請求恢復執行。
這樣就可以保證整個指令碼是作為一個整體執行的,中間不會被其他命令插入,這就是所謂的原子性中的”不可拆分”特性。
但是,如果事務執行過程中命令產生錯誤,事務是不會回滾的,也不會影響後續命令的執行。
也就是說,Redis保證以原子方式執行Lua指令碼,但是不保證指令碼中所有操作要麼都執行或者都會滾。
那就意味著,Redis中Lua指令碼的執行,可以保證併發程式設計中不可再拆分的這個原子性,但是沒有保證資料庫ACID中要麼都執行要麼都會滾的這個原子性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2931136/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java併發程式設計-併發程式設計的Bug源頭:可見性、原子性和有序性問題Java程式設計
- 併發程式設計基礎 - 管程模型和synchronized原子性程式設計模型synchronized
- Java併發程式設計Bug源頭:可見性、原子性和有序性問題Java程式設計
- 不支援原子性的 Redis 事務也叫事務嗎?Redis
- Java併發之原子性、有序性、可見性Java
- 事務的性質(ACID)
- 面試官:Redis的事務滿足原子性嗎?面試Redis
- 《java併發程式設計的藝術》原子操作類Java程式設計
- 併發程式設計基礎與原子操作程式設計
- Java併發程式設計之原子變數Java程式設計變數
- Unsafe原子性
- C++11併發程式設計:原子操作atomicC++程式設計
- Go併發程式設計之原子操作sync/atomicGo程式設計
- Redis 中的原子操作(1)-Redis 中命令的原子性Redis
- 資料庫事務,原子性、一致性、隔離性、永續性資料庫
- 從JDK原始碼角度看併發的原子性如何保證JDK原始碼
- volatile 可見性與原子性
- 關於IOS 屬性atomic(原子性)的理解iOS
- 淺談併發的資料競爭(可見性)與競態條件(原子性)
- 從原子性挖到CAS
- volatile不保證原子性
- java併發程式設計JUC第十二篇:AtomicInteger原子整型Java程式設計
- 併發程式設計面試必備:JUC 中的 Atomic 原子類總結程式設計面試
- Volatile不保證原子性(二)
- 知其所以然~redis的原子性Redis
- Redis中的原子操作(2)-redis中使用Lua指令碼保證命令原子性Redis指令碼
- 你還不懂可見性、有序性和原子性?
- 高階java必須清楚的概念:原子性、可見性、有序性Java
- 執行緒安全性-原子性、可見性、有序性執行緒
- Redis 中的事務分析,Redis 中的事務可以滿足ACID屬性嗎?Redis
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- 【Java併發程式設計的藝術】第二章讀書筆記之原子操作Java程式設計筆記
- 三大性質總結:原子性、可見性以及有序性
- java編碼:保證方法呼叫鏈的原子性Java
- java多執行緒3:原子性,可見性,有序性Java執行緒
- java安全編碼指南之:可見性和原子性Java
- 什麼是網頁設計的"原子設計”?網頁
- Java 併發包原子操作類解析Java