事務處理:是一種機制,管理必須成批執行的MySQL操做,以保證數據庫不包含不完整的操做結果。用來維護數據庫的完整性。數據庫
利用事務處理,能夠保證一組操做不會中途中止,或做爲總體執行或徹底不執行(除非明確指示)。若是沒有發生錯誤,整組語句寫入數據庫,如發生錯誤,則進行回退,以恢復數據庫到某個已知且安全的狀態。安全
事務處理的幾個重要術語:服務器
·事務:一組SQL語句;函數
·回退:撤銷指定SQL語句的過程;編碼
·提交:將未存儲的SQL語句結果寫入數據庫表;spa
·保留點:事務處理中設置的臨時佔位符,能夠對它發佈回退(與回退整個事務處理不一樣);code
管理事務處理的關鍵:將SQL語句組分解爲邏輯塊,並明確規定數據什麼時候應該回退,什麼時候不該回退。blog
start transaction:標識事務的開始排序
1、使用rollback事務
rollback命令用來回退(撤銷)MySQL語句,以下:
1 select * from ordertotals; 2 start transaction; 3 delete from ordertotals; 4 select * from ordertotals; 5 rollback; 6 select * from ordertotals;
解析:用rollback語句回退start transaction以後的全部語句,最後一條select語句顯示該表不爲空。
PS:
rollback只能在一個事務處理內使用(在執行一條start transaction命令以後)。
事務處理用來管理select、insert和update語句;不能回退select語句(沒意義);不能回退create或drop操做(即便事務中使用這兩條語句,若是執行回退,它們也不會被撤銷)。
2、使用commit
通常MySQL語句都是直接針對數據庫表執行和編寫,也就是隱含提交,即提交(寫或保存)操做是自動的;但在事務處理塊中,提交不會隱含地進行。爲進行明確的提交, 使用commit語句,以下:
1 start transaction; 2 delete from orderitems where order_num = '20010'; 3 delete from orders where order_num = '20010'; 4 commit;
解析:從系統中徹底刪除訂單20010,涉及更新兩個數據庫表,因此使用事務處理塊來保證訂單不被部分刪除。commit語句僅在不出錯時寫出更改。若是第一條delete起做用,但第二條失敗,則delete不會提交(被自動撤銷)。
PS:當commit或rollback語句執行後,事務會自動關閉(未來的更改會隱含提交)。
3、使用保留點
複雜的事務處理可能須要部分提交或回退;
爲了支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符,若是須要回退,能夠回退到某個佔位符,這些佔位符稱爲保留點,爲了建立佔位符,可使用savepoint語句,好比:savepoint deletel;
解析:每一個保留點都取標識它的惟一名字,以便回退時MySQL知道要回退到何處。如爲回退到本例給出的保留點,可使用:rollback to deletel;
PS:保留點越多越好,這樣能夠更靈活的回退;保留點在事務處理完成後自動釋放,或也能夠用release savepoint明確的釋放保留點。
4、更改默認提交行爲
默認的MySQL行爲是自動提交全部更改,即該SQL語句都是針對表執行的,並且當即生效;爲指示MySQL不自動提交更改,可使用:set autocommit = 0;
autocommit標誌決定是否自動提交更改,無論有沒有commit語句;即設置autocommit=0(假)指示MySQL不自動提交更改(直到autocommit被設置爲真爲止)。
PS:autocommit標誌是針對每一個鏈接,而不是服務器。
數據庫表被用來存儲和檢索數據,不一樣的語言和字符集須要以不一樣的方式存儲和檢索。所以MySQL須要適應不一樣的字符集,適應不一樣排序和檢索數據的方法。
常見的術語:
·字符集:字母和符號的組合
·編碼:爲某個字符集成員的內部表示
·校對:爲規定字符如何比較的指令
1、查看字符集
查看所支持的字符集完整列表,可使用:show character set;
這條語句顯示全部可用的字符集以及每一個字符集的描述和默認校對。
爲查看所支持校對的完整列表,可以使用:show collation;
此語句顯示全部可用的校對,以及它們適用的字符集。
PS:一般系統管理在安裝時定義一個默認的字符集合校對,也可在建立數據庫時,指定默認的字符集和校對;爲了肯定所用字符集合校對,可以使用如下語句:
show variables like 'character%';
show cariables like 'collation%';
PS:事實上,字符集不多是服務器範圍(甚至數據庫範圍);不一樣表甚至不一樣列,均可能須要不一樣字符集,並且二者均可以在建立表時指定。
2、指定字符集和校對
爲了給表指定字符集和校對,可以使用以下語句:
1 create table mytable 2 ( 3 columnn1 int, 4 columnn2 varchar(10) 5 ) default character set hebrew 6 collate hebrew_general_ci;
解析:建立一個包含兩列的表,而且指定字符集和校對順序。
MySQL默認使用的字符集和校對:
·若是指定character set和collate二者,則使用這些值;
·若是隻指定character set,則使用此字符集及其默認的校對;
·若是既不指定character set,也不指定collate,則使用數據庫默認。
PS:MySQL容許對每一個列設置字符集和校對,例句以下:
1 create table mytable 2 ( 3 columnn1 int, 4 columnn2 varchar(10), 5 columnn3 varchar(10) character set latin1 collate latin1_general_ci 6 ) default character set hebrew 7 collate hebrew_general_ci;
校對在對用order by子句檢索出來的數據排序時起重要的做用,若是你須要用與建立表時不一樣的校對順序排序特定的select語句,能夠在select語句自身中進行,好比:
1 select * from customers 2 order by lastname,firstname collate latinl_general_cs;
select使用collate指定一個備用的校對順序(爲區分大小寫校對),這樣將影響到結果排序的次序。COLLATE還能夠用於GROUP BY、HAVING、彙集 函數、別名等。
PS:若是絕對須要,串能夠在字符集之間進行轉換,使用cast()或 convert()函數。