您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中事務(wù)是什么意思,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、事務(wù)的概念
事務(wù)由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執(zhí)行失敗或產(chǎn)生錯誤,整個單元將會回滾。所有受到影響的數(shù)據(jù)將返回到事物開始以前的狀態(tài);如果單元中的所有SQL語句均執(zhí)行成功,則事物被順利執(zhí)行。
二、MySQL 中的存儲引擎以及支持事務(wù),和不支持事務(wù)的存儲引擎
1、存儲引擎的概念:在mysql中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或內(nèi)存)中。
這些技術(shù)中的每一種技術(shù)都使用不同的存儲機制,索引 技巧,并且最終提供廣泛的不同的功能和能力??梢酝ㄟ^選擇不同的技術(shù),可以獲得額外的速度或功能,從而改善應(yīng)用的整體功能。
2、這些不同的技術(shù)以及配套的相關(guān)功能在mysql中被稱為存儲引擎(也稱為表類型)。
3、通過show engines;來查看mysql支持的存儲引擎。
4、 在mysql中用的最多的存儲引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事務(wù)而myisam等不支持事務(wù)。
三、事務(wù)的四個屬性:
1、原子性:事務(wù)是由一個或一組相互關(guān)聯(lián)的SQL語句組成,這些語句被認(rèn)為是一個不可分割的單元。
2、一致性:對于數(shù)據(jù)庫的修改是一致的,即多個用戶查的的數(shù)據(jù)是一樣的。一致性主要由mysql的日志機制處理,他記錄數(shù)據(jù)的變化,為事務(wù)恢復(fù)提供跟蹤記錄。
3、隔離性(孤立性):每個事務(wù)都有自己的空間,和其他發(fā)生在系統(tǒng)中的事務(wù)隔離開來,而且事務(wù)的結(jié)果只在他完全被執(zhí)行時才能看到
4、持久性:但提交了這個事務(wù)之后對數(shù)據(jù)的修改更新就是永久的。當(dāng)一個事務(wù)完成,數(shù)據(jù)庫的日志已經(jīng)被更新時,持久性即可發(fā)揮其特有的 功效,在mysql中,如果系統(tǒng)崩潰或者數(shù)據(jù)存儲介質(zhì)被破壞,通過日志,系統(tǒng)能夠恢復(fù)在重啟前進行的最后一次成功更新,可以反應(yīng)系統(tǒng)崩潰時處于執(zhí)行過程的事物的變化。
四、事務(wù)的創(chuàng)建及生存周期
對于支持事務(wù)的存儲引擎,一個事務(wù)的周期:
1、在創(chuàng)建事務(wù)的過程中,用戶需要創(chuàng)建一個innodb或bdb類型的數(shù)據(jù)表,其基本命令結(jié)構(gòu)如下:
create table table_name (file defintions) type=innodb/bdb;
2、對表類型進行修改
alert table table-name type =innodb/bdb;
3、事務(wù)的整個過程
use databases; //使用某個數(shù)據(jù)庫
start transaction ; //開始事務(wù) 、這里也可以使用 begin 、 beginwork
insert into stu1 values('', ); //進行相關(guān)的操作
commit //提交事物
rollback //撤銷事務(wù)(事務(wù)回滾)
五:mysql行為
1、我們在使用mysql是如果關(guān)閉之后,打開在查詢的話就會發(fā)現(xiàn),哪些數(shù)據(jù)已經(jīng)保存了,但是我們知道,在這過程中沒有進行顯示或隱式提交,問什么會這樣那?因為我們在mysql中設(shè)置了自動提交,但我們也可以改為手動提交。
2、 set autocommit =0; //關(guān)閉自動提交
3、 set autocommit =1; //開啟自動提交
六、事務(wù)的孤立性(隔離性)
1、在多用戶的時候使用孤立性級別是很重要的,這樣可以保證這些事務(wù)互不影響,保證數(shù)據(jù)庫性能不受到影響。
2、mysql中提供的孤立級別有以下四種:
SQL標(biāo)準(zhǔn)定義了4類隔離級別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。
Read Uncommitted(讀取未提交內(nèi)容)
在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級別很少用于實際應(yīng)用,因為它的性能也不比其他級別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。
Read Committed(讀取提交內(nèi)容)
這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。這種隔離級別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因為同一事務(wù)的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結(jié)果。
Repeatable Read(可重讀)
這是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
Serializable(可串行化)
這是最高的隔離級別,它通過強制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。
這四種隔離級別采取不同的鎖類型來實現(xiàn),若讀取的是同一個數(shù)據(jù)的話,就容易發(fā)生問題。例如:
臟讀(Drity Read):某個事務(wù)已更新一份數(shù)據(jù),另一個事務(wù)在此時讀取了同一份數(shù)據(jù),由于某些原因,前一個RollBack了操作,則后一個事務(wù)所讀取的數(shù)據(jù)就會是不正確的。
不可重復(fù)讀(Non-repeatable read):在一個事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個事務(wù)更新的原有的數(shù)據(jù)。
幻讀(Phantom Read):在一個事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個事務(wù)查詢了幾列(Row)數(shù)據(jù),而另一個事務(wù)卻在此時插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中,就會發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。
在MySQL中,實現(xiàn)了這四種隔離級別,分別有可能產(chǎn)生問題如下所示:
3、事務(wù)孤立級的查看和修改:
查看:select @@tx_isolation;
修改:set global transaction isolation level 設(shè)置的孤立級別;
七、偽事務(wù)(鎖定)
1、在MySQL中根據(jù)不同的需求,提供了很多存儲引擎,但是有的存儲引擎不支持事務(wù),對于這種情況,可以使用表鎖定來代替事務(wù)。
2、對于不支持事務(wù)的存儲引擎MYISAM類型數(shù)據(jù)表,當(dāng)用戶插入,修改,刪除時,這些操作都會立即保存到磁盤中,當(dāng)多用戶同時操作某個表時,可以使用表鎖定來避免同一時間有多個用戶對數(shù)據(jù)庫中指定表進行操作,這樣可以避免在用戶操作數(shù)據(jù)表過程中受到干擾。只有但用戶釋放表的操作鎖定后,其他 用戶才可以訪問這些修改的數(shù)據(jù)表。
這里的鎖和Java多線程中鎖的作用一樣,個人覺的可以這樣理解。
3、對指定表進行鎖操作的過程:
(1)lock table table-name lock type ; //locktype 有read 和write 兩種
對多個表進行加鎖:
lock table table-name1 lock type, table -name2 lock type ,table -name3 lock type;
(2)在指定的表中進行相應(yīng)的操作
(3)當(dāng)用戶完成對鎖定數(shù)據(jù)表的操作后,進行解鎖。
unlock tables ; //釋放了所有加鎖表的鎖。
以上是“MySQL中事務(wù)是什么意思”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。