mysql-管理事务
一、介紹
mysql支持幾種基本的數(shù)據(jù)庫引擎,其中MYSQL的兩種最基本的引擎MyISAM和InnoDB,其中只有InnoDB支持事務(wù)管理。
事務(wù)處理:可以用來維護數(shù)據(jù)庫的完整性,他保證成批的MySQL操作要么完全執(zhí)行,要么不完全執(zhí)行。
事務(wù)處理是一種機制,用來管理必須成批執(zhí)行的MYSQL操作,以保證數(shù)據(jù)庫不包含不完整的操作結(jié)果。
?
二、事務(wù)的幾個基本術(shù)語
事務(wù)(transaction):指一組SQL語句
回退(rollback):指撤銷指定SQL語句的過程
提交(commit):指將未存儲的SQL語句結(jié)果寫入數(shù)據(jù)庫表。
保留點(savepoint):指事務(wù)處理中設(shè)置的臨時占位符,你可以對它發(fā)布回退(與回退整個事務(wù)處理不同)
?
三、控制事務(wù)處理
事務(wù)開始:
start transaction;
1、使用ROLLBACK:MySQL用這個命令來回退(撤銷)MySQL語句:
select * from ordertotal;
start transaction;
delete from transaction;
select * from ordertotals;
rollbaclk;
select * from ordertotals;
雖然已經(jīng)刪除數(shù)據(jù),但是我們在提交之前使用了rollback,那么在進行查詢的時候,已經(jīng)刪除了的數(shù)據(jù)又恢復(fù)了。
rollback只能在一個事務(wù)處理內(nèi)使用,事務(wù)處理用來管理insert,update和delete語句,而select,create,drop等都不能使用事務(wù)管理。
2、使用commit:在事務(wù)處理中,提交并不會隱含的進行,為進行明確的提交,使用commit語句。
start transaction;
delete from orderitems where order_num=20010;
delete from orders where order_num=20010;
commit;
?
3、使用保留點:簡單的rollback和commit語句就可以寫入或撤銷整個事務(wù)處理,但是更復(fù)雜的事務(wù)處理可能需要部分提交或回退。
為了支持回退部分事務(wù)處理,必須能在事務(wù)處理塊中合適的位置放置占位符,這樣需要回退,可以回退到某個占位符。
savepoint delete1;
rollback to delete1;
4、更改默認(rèn)的提交方式
默認(rèn)的mysql行為是自動提交所有的改動,但是你可以設(shè)置Mysql不自動提交修改,如下:
set autocommit=0;
?
三、事務(wù)隔離級別
事務(wù)隔離性:是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。
1、串行化(Serializable):所有事務(wù)一個接一個執(zhí)行,這樣可以避免幻讀(phantom read),對于基于鎖來實現(xiàn)的并發(fā)控制的數(shù)據(jù)庫來說,串行化要求在執(zhí)行范圍查詢的時候,需要獲取范圍鎖,如果不是基于鎖實現(xiàn)并發(fā)控制的數(shù)據(jù)庫,則檢查到有違反串行操作的事務(wù)時,需回滾該事務(wù)。
2、可重復(fù)讀(repeated read):所有被select獲取的數(shù)據(jù)都不能被修改,這樣就可以避免一個事務(wù)前后讀取不一致的情況。但是沒有辦法控制幻讀,因為這個時候事務(wù)不能更改所選的數(shù)據(jù),但是可以增加數(shù)據(jù),因為強惡意事務(wù)沒有范圍鎖。(事務(wù)a讀取數(shù)據(jù),事務(wù)b可以同樣讀取,不可以更改數(shù)據(jù),但是可以增加數(shù)據(jù))
3、讀已提交(read commit):被讀取的數(shù)據(jù)可以被其他事務(wù)修改,這樣可能導(dǎo)致不可重復(fù)讀,也就是說,事務(wù)讀取的時候,獲取讀鎖,但是在讀完之后立即釋放(不需要等事務(wù)結(jié)束),而寫鎖則是事務(wù)提交之后才釋放的,釋放讀鎖之后就可能被其他事務(wù)修改數(shù)據(jù)。改等級也是sql server默認(rèn)的隔離等級。(事務(wù)a讀取數(shù)據(jù),事務(wù)b不可以讀取數(shù)據(jù),事務(wù)b可以修改數(shù)據(jù))
4、讀未提交(read uncommitted):最低的隔離等級,允許其他事物看到?jīng)]有提交的數(shù)據(jù),會導(dǎo)致臟讀。
?
總結(jié):1、四個級別逐漸增強,每個級別解決一問題;
? 2、事務(wù)級別越低,性能越差,大多數(shù)環(huán)境read committed就可以用了。
轉(zhuǎn)載于:https://www.cnblogs.com/television/p/8370786.html
總結(jié)
以上是生活随笔為你收集整理的mysql-管理事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++高精度类
- 下一篇: linux cmake编译源码,linu