日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

事务ACID理解复习

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事务ACID理解复习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

談到事務一般都是以下四點

原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
一致性(Consistency)
事務前后數據的完整性必須保持一致。
隔離性(Isolation)
事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響

舉個簡單的例子理解以上四點

原子性
針對同一個事務

這個過程包含兩個步驟

A: 800 - 200 = 600
B: 200 + 200 = 400

原子性表示,這兩個步驟一起成功,或者一起失敗,不能只發生其中一個動作

一致性(Consistency)
針對一個事務操作前與操作后的狀態一致

操作前A:800,B:200
操作后A:600,B:400

一致性表示事務完成后,符合邏輯運算

持久性(Durability)
表示事務結束后的數據不隨著外界原因導致數據丟失

操作前A:800,B:200
操作后A:600,B:400
如果在操作前(事務還沒有提交)服務器宕機或者斷電,那么重啟數據庫以后,數據狀態應該為
A:800,B:200
如果在操作后(事務已經提交)服務器宕機或者斷電,那么重啟數據庫以后,數據狀態應該為
A:600,B:400

隔離性(Isolation)
針對多個用戶同時操作,主要是排除其他事務對本次事務的影響

兩個事務同時進行,其中一個事務讀取到另外一個事務還沒有提交的數據,B


事務的隔離級別
臟讀:
指一個事務讀取了另外一個事務未提交的數據。

###不可重復讀:
在一個事務內讀取表中的某一行數據,多次讀取結果不同。(這個不一定是錯誤,只是某些場合不對)

頁面統計查詢值

點擊生成報表的時候,B有人轉賬進來300(事務已經提交)


虛讀(幻讀)
是指在一個事務內讀取到了別的事務插入的數據,導致前后讀取不一致。
(一般是行影響,多了一行)

四種隔離級別設置
####數據庫
set transaction isolation level 設置事務隔離級別
select @@tx_isolation?? ?查詢當前事務隔離級別

####java
適當的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation

mysql模擬事務隔離性測試

SELECT @@session.tx_isolation; SELECT @@tx_isolation; SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; SET SESSION TRANSACTION ISOLATION LEVEL read committed; SET SESSION TRANSACTION ISOLATION LEVEL repeatable read; SET SESSION TRANSACTION ISOLATION LEVEL serializable; start transaction;--建表 drop table AMOUNT; CREATE TABLE `AMOUNT` ( `id` varchar(10) NULL, `money` numeric NULL ) ; --插入數據 insert into amount(id,money) values('A', 800); insert into amount(id,money) values('B', 200); insert into amount(id,money) values('C', 1000); --測試可重復讀,插入數據 insert into amount(id,money) values('D', 1000);--設置事務 SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; SELECT @@tx_isolation; --開啟事務 start transaction;--臟讀演示,讀到其他事務未提交的數據 --案列1,事務一:A向B轉200,事務二:查看B金額變化,事務一回滾事務 update amount set money = money - 200 where id = 'A'; update amount set money = money + 200 where id = 'B';--不可重復讀演示,讀到了其他事務提交的數據 --案列2,事務一:B向A轉200,事務二:B向C轉200轉100 SET SESSION TRANSACTION ISOLATION LEVEL read committed; --開啟事務 start transaction; --兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬) select * from amount; --事務一:B向A轉200 update amount set money = money - 200 where id = 'B'; update amount set money = money + 200 where id = 'A';commit; --事務二:B向C轉200轉100 update amount set money = money - 100 where id = 'B'; update amount set money = money + 100 where id = 'C'; commit; --從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數--幻讀演示 --案列3,事務一:B向A轉200,事務二:B向C轉200轉100 SET SESSION TRANSACTION ISOLATION LEVEL repeatable read; --開啟事務 start transaction; --兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬) select * from amount; --事務一:B向A轉200 update amount set money = money - 200 where id = 'B'; update amount set money = money + 200 where id = 'A';commit; --事務二:B向C轉200轉100 update amount set money = money - 100 where id = 'B'; update amount set money = money + 100 where id = 'C'; commit; --從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數

?

  • serializable事務二會一直等著事務一提交再操作

?

?

總結

以上是生活随笔為你收集整理的事务ACID理解复习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。