锁究竟锁住的是什么?
背景:今天遇到一個問題,在一個長事務中,我調用服務a去寫數據(redis數據庫不支持事物),然后調我的服務去寫這個數據,但是我主數據庫是事務型數據庫。當我事務失敗會滾的時候,服務a去寫的數據并沒有做相應的會滾動作。導致重新發起調用的時候,數據庫沒有值,但是redis有值,我的處理邏輯是redis有值我就不會去進行寫操作了,直接查回去就行了。所以尷尬的是我的主數據庫里面永遠丟失了這條數據。(業務要求數據無論成功與否都最好寫入數據庫中)
于是乎:
1、我對寫入主數據庫的方法做了異步,保證事務異常仍然不會會滾數據。
2、我對還沒提交事務的時候的數據優先查詢redis的數據。
保障了數據是最新的,而且在第二次使用數據的時候,數據庫里面因為異步也會存在該數據。
但是我發現,debug模式下,打斷點在異步方法中,主線程并沒有繼續執行,而是等待。但是事務失敗后,該數據仍然對主數據庫進行了寫入操作
什么是事務?
事務必須服從ACID原則。ACID指的是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。 通俗理解,事務其實就是一系列指令的集合
- 原子性:操作這些指令時,要么全部執行成功,要么全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。
- 一致性:事務的執行使數據從一個狀態轉換為另一個狀態,但是對于整個數據的完整性保持穩定。
- 隔離性:在該事務執行的過程中,無論發生的任何數據的改變都應該只存在于該事務之中,對外界不存在任何影響。只有在事務確定正確提交之后,才會顯示該事務對數據的改變。其他事務才能獲取到這些改變后的數據。
- 持久性:當事務正確完成后,它對于數據的改變是永久性的。
?什么是鎖?
鎖是用于解決隔離性的一種機制。另外鎖有不同的粒度,同時事務也是有不同的隔離級別的(一般有四種:讀未提交Read uncommitted, 讀已提交Read committed, 可重復讀Repeatable read, 可串行化Serializable)。 在具體的程序設計中,開啟事務其實是要數據庫支持才行的,如果數據庫本身不支持事務,那么仍然無法確保你在程序中使用的事務是有效的。 鎖可以分為樂觀鎖和悲觀鎖: 悲觀鎖:認為在修改數據庫數據的這段時間里存在著也想修改此數據的事務; 樂觀鎖:認為在短暫的時間里不會有事務來修改此數據庫的數據; 我們一般意義上講的鎖其實是指悲觀鎖,在數據處理過程中,將數據置于鎖定狀態(由數據庫實現)
關于樂觀鎖和悲觀鎖文章可以看看這個https://www.jianshu.com/p/d2ac26ca6525
回答一下初衷:鎖究竟鎖住的什么?java的鎖會鎖住鎖住當前對象的線程換言之java方法棧的內存數據,事務為實現隔離型也有鎖這個鎖一般是數據庫級別的鎖,不只是單單鎖對象。
?
?
?
總結
以上是生活随笔為你收集整理的锁究竟锁住的是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机IO系列「零」计算机IO【硬件部分
- 下一篇: 计算机硬件组成