SQL語句中事務及特點

當執行一組DML操作時,爲了確保數據的完整性和一致性,避免數據庫產生錯誤數據,就需要通過事務(Transaction)使該組DML操作同時成功或失敗,例如:張三有兩張銀行卡,卡號分別是1234567890和0987654321,現從1234567890卡取出100塊錢轉到0987654321卡,則取出錢的卡需要減去100,轉入卡需要增加100,現實生活中這兩個update操作必須同時成功同時失敗,如下操作:

create table account(
  id char(36) primary key,
  card_id varchar(20) unique,
  name varchar(8) not null,
  money float(10,2) default 0
);

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','張三’);

#要求update操作同時成功同時失敗
update account set money=money-100 where card_id= '1234567890';
update account set money=money+100 where card_id= '0987654321';

當執行第一個DML SQL語句時,事務開始(set autocommit=0;#關閉自動上傳到內存 ),當出現以下情況時事務結束:

1、執行了commit或rollback語句;

2、執行了DDL語句(如建表語句)或DCL語句(如給用戶授權),如下:

set autocommit = 0;
insert into student 
values ('0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea','小明','18338954490','北京市大興區');
create table user_info(
       id char(36) primary key
)
#上面insert語句雖然沒有執行commit或rollback,但是因執行了建表語句,使得事務被隱式提交。

3、數據庫客戶端程序退出或數據庫崩潰時,爲了保持數據一致性,也會結束事務。

注意:

執行DML語句且沒有結束事務時,如果需要查詢數據庫的真實改變情況,則要求在一個新的SQL Window窗口中執行查詢語句:因爲事務中所做的每一個操作在事務被提交之前都是臨時的(存儲在緩存中),在commit或rollback語句執行之前,DML語句首先影響該用戶的數據庫緩衝區,因爲這些操作可以被恢復(rollback),而且因爲是在該用戶的數據緩衝區,所以在原SQL窗口中查詢得到的是數據緩衝區的結果,不是數據庫真實的數據;要想拿到數據庫真實的數據,需要在新SQL窗口中執行查詢語句,這樣針對不同的用戶,MySQL服務器用讀一致性來確保每個用戶看到的數據和上次提交時的數據相同。

當一個用戶執行DML語句時,如果其事物沒有結束,則受影響的行被鎖定,此時其它用戶不能改變受影響行中的數據,後面用戶所執行的DML語句會一直處於執行狀態,直至前一個用戶所執行DML語句事務結束,例如:

a、在一個SQL Window中執行如下SQL語句,並且不執行事務結束語句

set autocommit = 0;
update student set name='小強' where id='0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea';

b、然後再在一個新的SQL Window中執行如下SQL語句

set autocommit = 0;
delete from student where id='0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea';

由於update語句執行後沒有結束事務,所以delete語句執行後一致處於執行狀態,當update語句的事務結束,則delete語句結束執行狀態。

事務四大特性(ACID):

1、原子性(Atomicity):化學中的原子指不可再分的基本微粒,數據庫中原子性強調事務是一個不可分割的整體,事務開始後所有操作要麼全部成功,要麼全部失敗,不可能停滯在中間某個環節。如果事務執行過程中出錯就會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣不會對數據庫有任何影響。(強調過程)

2、一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,即一個事務執行之前和執行之後都必須處於一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還是5000,這就是事務的一致性。(強調結果)

3、隔離性(Isolation):當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離,比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉入錢。

4、持久性(Durability):一個事務一旦被提交,則對數據庫的所有更新將被保存到數據庫中,不能回滾。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章