通常,在此之前,我們說,一條語句使用乙個分號(;)來結束,並得到執行。
那麼我們說,這個「一次性執行」的過程,可以稱為「乙個事務」。
簡單來說,「一條sql語句,就是乙個事務」。
則:資料庫(自然包括mysql資料庫)中的事務,是指,可以將「多條語句」的執行,當作「一條語句」來看到的一種內部機制。
即:「事務」是一種可以保證「多條語句一次性執行完成」或「一條都不執行」的機制。
看乙個實際應用需求(銀行存款):表名cunkuan
id賬戶名
存款test1
test2
test3
現在,test1突然需要一筆錢,買
iphone8
,向test2
借錢4000
。銀行轉賬:
第一步: update cunkuan set 存款=存款
-4000 where id=2
;第一步做完,突然斷電了!
第二步: update cunkuan set 存款=存款
+4000 where id=1
;則如果沒有事務,就可能發生這種事情(**)。
如果有了事務,則就可以避免該事情。
事務可以看作是乙個「容器」,將多條語句,放入該容器,最後,只要乙個命令列,來決定其中的所有語句是否「執行」。
原子性:乙個事務中的所有語句,應該做到:要麼全做,要麼乙個都不做;
一致性:讓資料保持邏輯上的「合理性」,比如:乙個商品出庫時,既要讓商品庫中的該商品數量減1,又要讓對應使用者的購物車中的該商品加1;
隔離性:如果多個事務同時併發執行,但每個事務就像各自獨立執行一樣。
永續性:乙個事務執行成功,則對資料來說應該是乙個明確的硬碟資料更改(而不僅僅是記憶體中的變化)。
事務模式:就是讓每條執行語句是否當作「乙個事務」來看到的設定項。
mysql預設安裝好之後,其事務模式是:一條語句當作乙個事務。
比如:原來資料:
執行插入:
結果:
我們可以將其修改為:事務需要「認可」模式:
set autocommit = 0; //false,關閉該模式,即此時不再是一條語句乙個事務了。
//結果是:必須使用
commit
語句才能夠生效。
然後插入:
s重新整理:
可見,沒有變化。
然後再執行commit:
再重新整理;
注意:autocommit的設定值,只是影響通常情況下都每條語句的預設行為(自動提交還是等著
commit
提交)不管autocommit的值是什麼(1,0),我們也仍然可以使用事務的完整流程模式來實現事務,如下:
1,宣告事務開始:start transaction;
2, 設定多條要執行的具體語句,比如:
insert
, update
, delete, select
。。。其實就是執行,只是這些執行的語句,並不「生效」——其只是記憶體狀態下的執行,而不是物理狀態的執行。
3,判斷是否需要執行該些語句:
if( 判斷是否有錯誤)
eslse
判斷是否有錯誤通常分這兩種環境:
1,如果是cmd中,直接觀察是否出錯。
2,如果是
php程式中,那就需要使用
mysql_error()
函式來判斷是否有錯。
下來來使用事務完整轉賬這件事情(假設為cmd模式):
start transaction;
#第一步:
update cunkuan set 存款=存款
-4000 where id=2
;#第一步做完,突然斷電了?
#第二步:
update cunkuan set 存款=存款
+4000 where id=1
;則如果這兩條語句都沒有錯誤,就可以:
commit;
但,如果其中發生了錯誤,則可以:
rollback;
mysql 事務控制
同乙個會話中,執行insert update delete操作後,在會話commit之前,此時當前回話執行select操作可以檢索到更改的內容,其他會話無法檢索到當前回話更改的內容 進行業務處理時,當前業務如果沒有處理成功,要rollback當前回話已經執行的insert update delete...
資料庫部落格 DTL事務 許可權
ddl dml dcl dtl 概念 一組必須同時成功或者失敗的dml語句構成了乙個事務 insert delete update select 特性 acid 事務操作 四大特性 acid a 原子性 要麼都完成,要麼都不完成,是乙個整體start transaction 開啟事務 set aut...
事務控制語言 TCL
概念 乙個或一組sql語句組成的執行單元,執行單元所有sql語句要麼全執行,要麼全不執行。栗子 張三給李四轉賬。張三 賬戶1000元。李四 賬戶1000元。update 表 set 張三賬戶 500 where name 張三 資料庫中途異常.update 表 set 李四賬戶 1500 where...