如果你是一名后臺程式員開發,那么你一定或多或少的接觸過事務,因為相對于高并發,且業務有一定復雜性的系統來說,事務是一定需要的,而且是必須的,他可以幫助我們將若干不同的子任務當成一個整體來完成,以保證整個業務的正確性,
舉個簡單的例子:
在七夕這天,你給你的女票發了一個520紅包
對于錢款轉移的這個程序來說,存在兩個子任務
首先從你的余額里扣款(520元)
同時往你的女票余額里增加錢(520元)
這兩個子任務對于紅包業務來說,要么都成功,要么都不成功,不應該存在你扣款了,但是你的女票沒有加錢的中間狀態,這種被看作一個整體,并且子任務的狀態都需要保持一致狀態的事情(狀態:操作成功,或者完全沒有操作成功),我們就稱之為事務,(防盜連接:本文首發自http://www.cnblogs.com/jilodream/ )當然這只是一個非常簡單的例子,下邊是更專業的定義:
事務是資料庫管理系統,在執行的程序中的一個邏輯單位,他由一個有限的資料庫操作序列構成,
其中邏輯單位表示事務不可拆分,結果一致(成功或者失敗)
而我們平常更多的將事務特指DML型別的操作,也就是對資料的增刪改,而不是所有的資料庫操作,例如其他的建表,刪表等,
這里還要注意的一點是,事務是一個能力,并不是所有的資料庫都支持事務的,在mysql中,只有官方自帶的引擎只有NDBA和innodb支持事務,
針對事務,我們從四個方面進行探討,也就是事務的四大特性---ACID

下邊我們來分別談談這四個特性
A:Atomicity 原子性
原子性是指啥呢?
原子Atomicity在希臘語中轉化而來,本意就是不可再拆分,最終結果要么就是全部成功,要么就是全部失敗,不存在拆分開來,部分成功的場景,也就是是前文所說的邏輯單位,
D:Durability 持久性
只要事務提交成功,那么事務對資料庫的操作就是一個永久性的作用,不會存在提交后,由于系統的原因,導致操作的效果消失了,
I :Isolation 隔離性
資料庫存在多個事務同時操作時,應該保證事務時間互相不干擾,操作互相不影響,
如果像java語言中通過同步鎖線性的操作,隔離性的問題肯定可以解決,但是這樣操作就導致事務都是串行操作,效率低下,因此可以通過適當的調整隔離性,也就是事務互相之間的可見性的程度,來更好的提高性能,這就是隔離性所牽扯到一個隔離級別的問題,后邊的博客中我們會講到,
C:Consistency 一致性
一致性相對于其他特性來說最不容易理解,所以我們放到最后來講,
所謂的一致性指的是資料庫中的約束不會被打破,這種約束指兩部分,
第一資料庫的約束,如金額不能為負值,外鍵的約束
第二業務的約束,金額的轉出的總額和轉入的總額必須要相等,
這里有一個點,很多文章都解釋的不夠清楚,覺得一致性是指事務中不同的操作的狀態要一致,這個只是字面意思,而字面意思又因為翻譯的問題被曲解,所以很多人覺得一致性和原子性的概念很容易混淆,原因就在這里,更不理解為什么說一致性的是AID三個特性的最終目的,(防盜連接:本文首發自http://www.cnblogs.com/jilodream/ )所以更正確的理解應該是資料庫事務操作后應該與約束保持一致,這就都理解通了,
所以特別要注意,這里的Consistentcy與CAP中的C不是一層含義,而是指資料庫事務的操作,應該與業務要求保持一致,再啰嗦點,就是說,一致性是指資料要和預期的狀態保持一致,因此在嚴格的意義上來說,一致性并不是資料庫的特性,而是應用層(目的)的特性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/244665.html
標籤:其他
