MySql 事務控制語言(DTL)

2022-04-22 02:10:32 字數 2405 閱讀 9871

通常,在此之前,我們說,一條語句使用乙個分號(;)來結束,並得到執行。

那麼我們說,這個「一次性執行」的過程,可以稱為「乙個事務」。

簡單來說,「一條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...