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