mysql事务顺序重排_MySQL事务处理及字符集和校对顺序
一、事務(wù)處理 事務(wù)處理:是一種機(jī)制,管理必須成批執(zhí)行的MySQL操作,以保證數(shù)據(jù)庫(kù)不包含不完整的操作結(jié)果。用來(lái)維護(hù)數(shù)據(jù)庫(kù)的完整性。
利用事務(wù)處理,可以保證一組操作不會(huì)中途停止,或作為整體執(zhí)行或完全不執(zhí)行(除非明確指示)。如果沒(méi)有發(fā)生錯(cuò)誤,整組語(yǔ)句寫入數(shù)據(jù)庫(kù),如發(fā)生錯(cuò)誤,則進(jìn)行回退,以恢復(fù)數(shù)據(jù)庫(kù)到某個(gè)已知且安全的狀態(tài)。
事務(wù)處理的幾個(gè)重要術(shù)語(yǔ):
·事務(wù):一組SQL語(yǔ)句;
·回退:撤銷指定SQL語(yǔ)句的過(guò)程;
·提交:將未存儲(chǔ)的SQL語(yǔ)句結(jié)果寫入數(shù)據(jù)庫(kù)表;
·保留點(diǎn):事務(wù)處理中設(shè)置的臨時(shí)占位符,可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同);
管理事務(wù)處理的關(guān)鍵:將SQL語(yǔ)句組分解為邏輯塊,并明確規(guī)定數(shù)據(jù)何時(shí)應(yīng)該回退,何時(shí)不應(yīng)回退。
start transaction:標(biāo)識(shí)事務(wù)的開始
1、使用rollback
rollback命令用來(lái)回退(撤銷)MySQL語(yǔ)句,如下:
select * from ordertotals;
start transaction;
delete from ordertotals;
select * from ordertotals;
rollback;
select * from ordertotals;
解析:用rollback語(yǔ)句回退start transaction之后的所有語(yǔ)句,最后一條select語(yǔ)句顯示該表不為空。
PS:
rollback只能在一個(gè)事務(wù)處理內(nèi)使用(在執(zhí)行一條start transaction命令之后)。
事務(wù)處理用來(lái)管理select、insert和update語(yǔ)句;不能回退select語(yǔ)句(沒(méi)意義);不能回退create或drop操作(即使事務(wù)中使用這兩條語(yǔ)句,如果執(zhí)行回退,它們也不會(huì)被撤銷)。
2、使用commit
一般MySQL語(yǔ)句都是直接針對(duì)數(shù)據(jù)庫(kù)表執(zhí)行和編寫,也就是隱含提交,即提交(寫或保存)操作是自動(dòng)的;但在事務(wù)處理塊中,提交不會(huì)隱含地進(jìn)行。為進(jìn)行明確的提交, 使用commit語(yǔ)句,如下:
start transaction; delete from orderitems where order_num = '20010'; delete from orders where order_num = '20010'; commit; 解析:從系統(tǒng)中完全刪除訂單20010,涉及更新兩個(gè)數(shù)據(jù)庫(kù)表,所以使用事務(wù)處理塊來(lái)保證訂單不被部分刪除。commit語(yǔ)句僅在不出錯(cuò)時(shí)寫出更改。如果第一條delete起作用,但第二條失敗,則delete不會(huì)提交(被自動(dòng)撤銷)。
PS:當(dāng)commit或rollback語(yǔ)句執(zhí)行后,事務(wù)會(huì)自動(dòng)關(guān)閉(將來(lái)的更改會(huì)隱含提交)。
3、使用保留點(diǎn)
復(fù)雜的事務(wù)處理可能需要部分提交或回退;
為了支持回退部分事務(wù)處理,必須能在事務(wù)處理塊中合適的位置放置占位符,如果需要回退,可以回退到某個(gè)占位符,這些占位符稱為保留點(diǎn),為了創(chuàng)建占位符,可以使用savepoint語(yǔ)句,比如:savepoint deletel;
解析:每個(gè)保留點(diǎn)都取標(biāo)識(shí)它的唯一名字,以便回退時(shí)MySQL知道要回退到何處。如為回退到本例給出的保留點(diǎn),可以使用:rollback to deletel;
PS:保留點(diǎn)越多越好,這樣可以更靈活的回退;保留點(diǎn)在事務(wù)處理完成后自動(dòng)釋放,或也可以用release savepoint明確的釋放保留點(diǎn)。
4、更改默認(rèn)提交行為
默認(rèn)的MySQL行為是自動(dòng)提交所有更改,即該SQL語(yǔ)句都是針對(duì)表執(zhí)行的,而且立即生效;為指示MySQL不自動(dòng)提交更改,可以使用:set autocommit = 0;
autocommit標(biāo)志決定是否自動(dòng)提交更改,不管有沒(méi)有commit語(yǔ)句;即設(shè)置autocommit=0(假)指示MySQL不自動(dòng)提交更改(直到autocommit被設(shè)置為真為止)。
PS:autocommit標(biāo)志是針對(duì)每個(gè)連接,而不是服務(wù)器。
二、字符集和校對(duì)順序 數(shù)據(jù)庫(kù)表被用來(lái)存儲(chǔ)和檢索數(shù)據(jù),不同的語(yǔ)言和字符集需要以不同的方式存儲(chǔ)和檢索。因此MySQL需要適應(yīng)不同的字符集,適應(yīng)不同排序和檢索數(shù)據(jù)的方法。
常見的術(shù)語(yǔ):
·字符集:字母和符號(hào)的組合
·編碼:為某個(gè)字符集成員的內(nèi)部表示
·校對(duì):為規(guī)定字符如何比較的指令
1、查看字符集
查看所支持的字符集完整列表,可以使用:show character set;
這條語(yǔ)句顯示所有可用的字符集以及每個(gè)字符集的描述和默認(rèn)校對(duì)。
為查看所支持校對(duì)的完整列表,可使用:show collation;
此語(yǔ)句顯示所有可用的校對(duì),以及它們適用的字符集。
PS:通常系統(tǒng)管理在安裝時(shí)定義一個(gè)默認(rèn)的字符集合校對(duì),也可在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),指定默認(rèn)的字符集和校對(duì);為了確定所用字符集合校對(duì),可使用以下語(yǔ)句:
show variables like 'character%';
show cariables like 'collation%';
PS:事實(shí)上,字符集很少是服務(wù)器范圍(甚至數(shù)據(jù)庫(kù)范圍);不同表甚至不同列,都可能需要不同字符集,而且兩者都可以在創(chuàng)建表時(shí)指定。
2、指定字符集和校對(duì)
為了給表指定字符集和校對(duì),可使用如下語(yǔ)句:
create table mytable
( columnn1 int,
columnn2 varchar(10)
) default character set hebrew
collate hebrew_general_ci;
解析:創(chuàng)建一個(gè)包含兩列的表,并且指定字符集和校對(duì)順序。
MySQL默認(rèn)使用的字符集和校對(duì):
·如果指定character set和collate兩者,則使用這些值;
·如果只指定character set,則使用此字符集及其默認(rèn)的校對(duì);
·如果既不指定character set,也不指定collate,則使用數(shù)據(jù)庫(kù)默認(rèn)。
PS:MySQL允許對(duì)每個(gè)列設(shè)置字符集和校對(duì),例句如下:
create table mytable ( columnn1 int, columnn2 varchar(10), columnn3 varchar(10) character set latin1 collate latin1_general_ci ) default character set hebrew collate hebrew_general_ci;
校對(duì)在對(duì)用order by子句檢索出來(lái)的數(shù)據(jù)排序時(shí)起重要的作用,如果你需要用與創(chuàng)建表時(shí)不同的校對(duì)順序排序特定的select語(yǔ)句,可以在select語(yǔ)句自身中進(jìn)行,比如:
select * from customers order by lastname,firstname collate latinl_general_cs;
select使用collate指定一個(gè)備用的校對(duì)順序(為區(qū)分大小寫校對(duì)),這樣將影響到結(jié)果排序的次序。COLLATE還可以用于GROUP BY、HAVING、聚集 函數(shù)、別名等。
PS:如果絕對(duì)需要,串可以在字符集之間進(jìn)行轉(zhuǎn)換,使用cast()或 convert()函數(shù)。

[**最新2020整理收集的一些高頻面試題(都整理成文檔),有很多干貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細(xì)講解,也有詳細(xì)的學(xué)習(xí)規(guī)劃圖,面試題整理等,需要獲取這些內(nèi)容的朋友請(qǐng)加Q君樣:909038429**](https://jq.qq.com/?_wv=1027&k=LTrB46U1)
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql事务顺序重排_MySQL事务处理及字符集和校对顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hkss.exe是什么进程 有什么作用
- 下一篇: 2008r装mysql_mysql5.7