為了更好地講解事務,先建個表插入一些資料:
create
table account(
id char(36
)primary
key,
card_id varchar(20
)unique
,name varchar(8
)not
null
,money float(10
,2)default0)
;insert
into account
values
('6ab71673-9502-44ba-8db0-7f625f17a67d'
,'1234567890'
,'張三'
,1000);
insert
into account (id,card_id,name)
values
('9883a53d-9127-4a9a-bdcb-96cf87afe831'
,'0987654321'
,'張三'
);
當執行一組dml操作時,為了確保資料的一致性,避免資料庫產生錯誤資料,就需要通過事務(transaction)使該組dml操作同時成功或失敗,例如:張三有兩張銀行卡,卡號分別是1234567890和0987654321,現從1234567890卡取出100塊錢轉到0987654321卡,則取出錢的卡需要減去100,轉入卡需要增加100,現實生活中這兩個update操作必須同時成功同時失敗,如下操作:
#要求update操作同時成功同時失敗
update account set money=money-
100where card_id=
'1234567890'
;update account set money=money+
100where card_id=
'0987654321'
;#這裡兩條sql語句的方法實現賺錢功能,但如果其中一條語句出錯就會導致資金總額出現改變,這明顯是不允許的
注:mysql資料庫預設以單獨的乙個dml為乙個事務
為了更好地分析事務是如何作用的,這裡用手動啟動關閉事務的方式來講解他的作用(第乙個是提交事務):
set autocommit=0;
#開啟事務,在事務結束之前所有dml處於同乙個事務之中
update account set money=money-
100where card_id=
'1234567890'
;update account set money=ey+
100where card_id=
'0987654321'
;#明顯可以看出,這條sql語句是出錯的,也就是沒法執行money+100的操作,但上一條語句中money-100的操作卻執行了
commit
;#提交事務,講dml語句執行的結果持久化到磁碟
select
*from account;
這裡是回滾事務:
set autocommit=0;
#開啟事務,在事務結束之前所有dml處於同乙個事務之中
update account set money=money-
100where card_id=
'1234567890'
;update account set money=ey+
100where card_id=
'0987654321'
;rollback
;#回滾事務,撤銷之前的有效操作並結束事務(也就是這一組事務的操作都無效化)
其他結束事務的方法:1、執行了ddl語句(如建表語句)或dcl語句(如給使用者授權),相當於執行了commit
2、資料庫客戶端程式退出或資料庫崩潰時,為了保持資料一致性,也會結束事務。
事務進行中需要了解的情況:執行dml語句且沒有結束事務時,如果需要查詢資料庫的真實改變情況,則要求在乙個新的sql window視窗中執行查詢語句:因為事務中所做的每乙個操作在事務被提交之前都是臨時的,在commit或rollback語句執行之前,dml語句首先影響該使用者的資料庫緩衝區,因為這些操作可以被恢復,而且因為是在該使用者的資料緩衝區,所以在原sql視窗中查詢得到的是資料緩衝區的結果,不是資料庫真實的資料;要想拿到資料庫真實的資料,需要在新sql視窗中執行查詢語句,這樣針對不同的使用者,mysql伺服器用讀一致性來確保每個使用者看到的資料和上次提交時的資料相同。
總結:這裡用手動啟動關閉事務的方式只是為了方便來解釋事務的原理與運作方式,但實際應用是不會出現這樣的情況,開啟和關閉一定會在同一組**中被實現的,這裡特別說明,也為了下一章講jdbc中事務的實際應用做鋪墊。
public class test catch(exception e) catch (sqlexception e1)
e.printstacktrace();
}finally
} catch (sqlexception e)
try
} catch (sqlexception e)
} }}
資料庫之事務隔離級別簡析
資料庫之事務隔離級別簡析 在分布式的系統中,通常會有多個執行緒連線到資料庫中同時對乙個表進行操作 這裡的同時並不表示同乙個時間點,而是同時競爭cpu的資源,至於如何排程,就要看執行緒和作業系統如何進行排程了 這種情況下如果會話的事物設定不當,就會導致資料混亂,常常會出現以下三種情況 假設現在系統中有...
資料庫事務
事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...
資料庫 事務
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...