當執行一組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):乙個事務一旦被提交,則對資料庫的所有更新將被儲存到資料庫中,不能回滾。
sql查詢語句中
sql查詢語句中select t.status,t.rowid from person t where t.status 2,此處查詢的是status不等於2的記錄,並過濾掉status為null的記錄。注意 此處不管status是integer型別還是long型別,都會過濾掉status為null...
SQL語句中 ( ) 含義
表示外連線。條件關聯時,一般只列出表中滿足連線條件的資料。如果條件的一邊出現 則可列出該表中在條件另一側的資料為空的那些記錄。比如兩個表 員工表和工資表。員工表中有總經理 a b c四條記錄,工資表中只有a b c三人的記錄。如果寫如下語句 select 姓名,工資 from 員工表,工資表 whe...
Sql語句中的DDL語句
資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...