一、基本概念
- 事務(wù)是數(shù)據(jù)庫(kù)區(qū)別于文件系統(tǒng)的重要特性之一 , 當(dāng)有了事務(wù) , 就可以讓數(shù)據(jù)庫(kù)始終保持
一致性, 同時(shí)可以通過事務(wù)的機(jī)制恢復(fù)到某個(gè)時(shí)間點(diǎn), 保證了提交到數(shù)據(jù)庫(kù)的修改不會(huì)因?yàn)橄到y(tǒng)崩潰而丟失;
- 事務(wù)只是一個(gè)改變 , 是一些操作的集合 , 用專業(yè)術(shù)語(yǔ)說 , 就是一組
邏輯操作單元。事務(wù)本身不具備四個(gè)特性 , 而是通過某些手段盡可能讓執(zhí)行單元滿足四個(gè)特性 , 那么此時(shí)稱之為一個(gè)完整的事務(wù) 。
經(jīng)常在網(wǎng)絡(luò)上、現(xiàn)實(shí)中一提到事務(wù)就綁死ACID四個(gè)特性 , 但實(shí)際ACID不僅在事務(wù)中有體現(xiàn) , 還可以涵蓋各個(gè)領(lǐng)域 。二、事務(wù)處理的原則所有的事務(wù)都是作為
一組邏輯操作單元來執(zhí)行 , 即使出現(xiàn)故障 , 都不能改變這種方式 。當(dāng)在一個(gè)事務(wù)中執(zhí)行多個(gè)操作時(shí) , 要么事務(wù)提交(commit) , 所有修改都會(huì)永久地保存下來;要么事務(wù)回滾(rollback) , 所有修改都放棄 , 一切回歸最初狀態(tài) 。常見例子:
A給B轉(zhuǎn)賬 , A余額減少 , B余額增加 , 這是一套必須同時(shí)完成的操作 , 如果其中一個(gè)失敗了 , 則所有操作都會(huì)失敗 。
在SQL中體現(xiàn)為:
UPDATE account SET money = money - 100 WHERE name = 'A';UPDATE account SET money = money + 100 WHERE name = 'B';這兩句SQL語(yǔ)句就必須同時(shí)完成 , 或同時(shí)失敗 。
三、ACID
- 原子性(atomicity):指事務(wù)是不可分割的工作單位 , 要么全部提交 , 要么全部回滾 。
原子就是物理世界中最小的單位了 , 無法在繼續(xù)分下去了 , 表達(dá)的是一個(gè)整體性的概念 。
- 一致性(consistency):在事務(wù)執(zhí)行前后 , 數(shù)據(jù)從一個(gè)
合法性狀態(tài)轉(zhuǎn)換到另一個(gè)合法性狀態(tài), 這種狀態(tài)是語(yǔ)義上的 , 不同的業(yè)務(wù)場(chǎng)景 , 對(duì)于合法性狀態(tài)有不同的定義 。
可以理解為滿足預(yù)定結(jié)果的狀態(tài)稱為合法的狀態(tài) , 這種狀態(tài)由自己定義 , 比如現(xiàn)實(shí)世界中的約束 。如果滿足這種狀態(tài) , 那就是滿足一致性 , 如果不滿足 , 這操作失敗 , 事務(wù)回滾 。
比如余額字段設(shè)置為無符號(hào)數(shù)值 , 即錢是不允許負(fù)數(shù)的 , 如果此時(shí)SQL語(yǔ)句修改余額小于0 , 此時(shí)就不滿足定義的語(yǔ)義 , 所以SQL會(huì)執(zhí)行失敗(顯示出來就是報(bào)錯(cuò)) , 事務(wù)就會(huì)回滾 。
- 隔離性(isolation):
指事務(wù)的執(zhí)行不能被其它事務(wù)干擾 , 即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其它事務(wù)都是隔離的、獨(dú)立的 , 并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾 。
比如事務(wù)A把余額從0改成100了 , 此時(shí)事務(wù)A還沒有commit , 而事務(wù)B進(jìn)來讀取余額了 , 此時(shí)結(jié)果是0還是100?這個(gè)時(shí)候就引出
隔離級(jí)別這個(gè)概念了 。
- 持久性(durability):
指事務(wù)一旦提交(commit) , 對(duì)數(shù)據(jù)的改變就是永久性的 , 之后的其它操作丟不會(huì)對(duì)其有任何影響 。經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀
- 如何打開電腦的屏幕鍵盤
- 四個(gè)字成語(yǔ)和峽有關(guān)的
- 我的 Kafka 旅程 - Producer
- Windows esp-idf 安裝
- 建議收藏 Java線程同步的四種方式詳解
- 歷史上武則天和狄仁杰的關(guān)系
- 下 MySQL數(shù)據(jù)庫(kù)-數(shù)據(jù)表
- 2023年10月21日是補(bǔ)墻的黃道吉日嗎 2023年10月21日補(bǔ)墻好嗎
- 喬丹的招牌動(dòng)作有哪些
- 包貝爾的電影有哪些
