了解什么是資料庫的事務
事務就是資料庫管理系統(DBMS)執行程序中的一個邏輯單位(不可在進行分割),由一個有限的資料庫操作序列構成(多個DML陳述句,select陳述句不包括事務),只要是對資料庫進行一系列的資料更替操作,都是事務,
注意:mysql資料庫中在創建一個資料庫時,默認的是innodb資料庫引擎,目前接觸到的資料庫引擎只有使用這個引擎的資料庫和表才支持事務,
事務ACID
原子性(Atomicity,或稱不可分割性)理解:最常用的例子就是轉賬,要么同時發生,要么同時不發生,
隔離性(Isolation,又稱獨立性)理解:兩個人同時給一個賬戶轉賬,互不干擾,在并發中會有很多問題,后面介紹
持久性(Durability)理解:不論怎么重繪你的賬戶金額,都不會改變,
一致性(Consistency)理解:轉賬的金額要符合邏輯運算,
事務并發會帶來哪些問題?
1,臟讀(讀未提交的資料):在兩個并發事務中,開啟事務1,查詢資料得到的是1,開啟事務2,在事務2中修改資料為2并未提交,事務1再查詢,得到的資料為2,讀到了別人未提交的資料,當面臨龐大并發量時,問題會很嚴重,
2,不可重復讀(讀取了已提交的資料): 同上面的例子,在事務2修改或者洗掉(update/delete)了資料,并且提交了,然后事務1查詢到資料2,違反了隔離性的要求,事務互不干擾,
3,幻讀:同不可重復讀例子一樣,這時事務2不是修改洗掉,而是添加(insert into)
發現了問題,如何解決?
事務隔離級別
1,未提交讀(read uncommitted)上面的問題都解決不了,大白給,
2,已提交讀(read committed)解決了臟讀,
3,可重復讀(repeatableread)解決了臟讀,不可重復讀,(常用)
4,串行化(serializable)什么都解決了,不讓你并發就沒問題了呀,
MySQL 命令列的默認設定下,事務都是自動提交的,即執行 SQL 陳述句后就會馬上執行 COMMIT 操作,因此要顯式地開啟一個事務務須使用命令set autocommit = 0 用來禁止使用當前會話的自動提交,
begin;##事務開始
update vip set vname='god' where vid=3;##eg
insert into manager(muser,mpassword) values ('qwe','123456');##eg
select * from manager;##eg
COMMIT;##事務提交
ROLLBACK;##回滾
show variables like 'autocommit';##查看自動提交狀態
set autocommit = 1;//默認為1,顯示on
set autocommit = 0 ;//關閉,顯示為off
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/213018.html
標籤:AI
上一篇:MySql常用SQL陳述句
