MySQL中事務(wù)是什么

這篇文章給大家分享的是有關(guān)MySQL中事務(wù)是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站主營婁煩網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,婁煩h5微信小程序開發(fā)搭建,婁煩網(wǎng)站營銷推廣歡迎婁煩等地區(qū)企業(yè)咨詢

1. 在MySQL環(huán)境中,事務(wù)由作為一個單獨單元的一個或多個SQL語句組成。這個單元中的每個SQL語句是互相依賴的,而且單元作為一個整體是不可分割的。如果單元中的一個語句不能完成,整個單元就會回滾(撤銷),所有影響到的數(shù)據(jù)將返回到事務(wù)開始以前的狀態(tài)。因而,只有事務(wù)中的所有語句都成功地執(zhí)行才能說這個事務(wù)被成功地執(zhí)行。

2.并不是所有的存儲引擎都支持事務(wù),如InnoDB和BDB支持,但MyISAM和MEMORY不支持。
 
通過InnoDB和BDB表類型,MySQL 事務(wù)系統(tǒng)能夠完全滿足事務(wù)安全的ACID測試。舊的表類型,如MyISAM類型,不支持事務(wù)。因此,這種系統(tǒng)中的事務(wù)只能通過直接的表鎖定實現(xiàn)。
 
術(shù)語“ACID”是一個簡稱,每個事務(wù)的處理必須滿足ACID原則,即原子性:A(atom)、一致性:C(consistent)、隔離性:I(independence)、持久性:D(durability)。
 
(1)原子性
 
原子性意味著每個事務(wù)都必須被認(rèn)為是一個不可分割的單元。假設(shè)一個事務(wù)由兩個或者多個任務(wù)組成,其中的語句必須同時成功才能認(rèn)為事務(wù)是成功的。如果事務(wù)失敗,系統(tǒng)將會返回到事務(wù)以前的狀態(tài)。
 
在添加雇員這個例子中,原子性指如果沒有創(chuàng)建雇員相應(yīng)的工資表和部門記錄,就不可能向雇員數(shù)據(jù)庫添加雇員。  www.2cto.com  
 
原子的執(zhí)行是一個或者全部發(fā)生或者什么也沒有發(fā)生的命題。在一個原子操作中,如果事務(wù)中的任何一個語句失敗,前面執(zhí)行的語句都將返回,以保證數(shù)據(jù)的整體性沒有受到影響。這在一些關(guān)鍵系統(tǒng)中尤其重要,現(xiàn)實世界的應(yīng)用程序(如金融系統(tǒng):轉(zhuǎn)賬)執(zhí)行數(shù)據(jù)輸入或更新,必須保證不出現(xiàn)數(shù)據(jù)丟失或數(shù)據(jù)錯誤,以保證數(shù)據(jù)安全性。
 
(2)一致性
 
不管事務(wù)是完全成功完成還是中途失敗,當(dāng)事務(wù)使系統(tǒng)處于一致的狀態(tài)時存在一致性。參照前面的例子,一致性是指如果從系統(tǒng)中刪除了一個雇員,則所有和該雇員相關(guān)的數(shù)據(jù),包括工資數(shù)據(jù)和組的成員資格也要被刪除。
 
在MySQL中,一致性主要由MySQL的日志機(jī)制處理,它記錄了數(shù)據(jù)庫的所有變化,為事務(wù)恢復(fù)提供了跟蹤記錄。如果系統(tǒng)在事務(wù)處理中間發(fā)生錯誤,MySQL恢復(fù)過程將使用這些日志來發(fā)現(xiàn)事務(wù)是否已經(jīng)完全成功地執(zhí)行,是否需要返回。因而一致性屬性保證了數(shù)據(jù)庫從不返回一個未處理完的事務(wù)。
 
(3)隔離性
 
隔離性是指每個事務(wù)在它自己的空間發(fā)生,和其他發(fā)生在系統(tǒng)中的事務(wù)隔離,而且事務(wù)的結(jié)果只有在它完全被執(zhí)行時才能看到。即使在這樣的一個系統(tǒng)中同時發(fā)生了多個事務(wù),隔離性原則保證某個特定事務(wù)在完全完成之前,其結(jié)果是看不見的。
 
當(dāng)系統(tǒng)支持多個同時存在的用戶和連接時(如MySQL),這就尤其重要。如果系統(tǒng)不遵循這個基本規(guī)則,就可能導(dǎo)致大量數(shù)據(jù)的破壞,如每個事務(wù)的各自空間的完整性很快地被其他沖突事務(wù)所侵犯。
 
獲得絕對隔離性的唯一方法是保證在任意時刻只能有一個用戶訪問數(shù)據(jù)庫。當(dāng)處理像MySQL這樣多用戶的RDBMS時,這不是一個實際的解決方法。但是,大多數(shù)事務(wù)系統(tǒng)使用頁級鎖定或行級鎖定隔離不同事務(wù)之間的變化,這是要以降低性能為代價的。例如,MySQL的BDB表處理程序使用頁級鎖定來保證處理多個同時發(fā)生的事務(wù)的安全,InnoDB表處理程序使用更好的行級鎖定。
 
(4)持久性
 
持久性是指即使系統(tǒng)崩潰,一個提交的事務(wù)仍然存在。當(dāng)一個事務(wù)完成,數(shù)據(jù)庫的日志已經(jīng)被更新時,持久性就開始發(fā)生作用。大多數(shù)RDBMS產(chǎn)品通過保存所有行為的日志來保證數(shù)據(jù)的持久性,這些行為是指在數(shù)據(jù)庫中以任何方法更改數(shù)據(jù)。數(shù)據(jù)庫日志記錄了所有對于表的更新、查詢、報表等。
 
如果系統(tǒng)崩潰或者數(shù)據(jù)存儲介質(zhì)被破壞,通過使用日志,系統(tǒng)能夠恢復(fù)在重啟前進(jìn)行的最后一次成功的更新,反映了在崩潰時處于過程的事務(wù)的變化。
 
MySQL通過保存一條記錄事務(wù)過程中系統(tǒng)變化的二進(jìn)制事務(wù)日志文件來實現(xiàn)持久性。如果遇到硬件破壞或者突然的系統(tǒng)關(guān)機(jī),在系統(tǒng)重啟時,通過使用最后的備份和日志就可以很容易地恢復(fù)丟失的數(shù)據(jù)。
 
默認(rèn)情況下,InnDB表是100%持久的(所有在崩潰前系統(tǒng)所進(jìn)行的事務(wù)在恢復(fù)過程中都可以可靠地恢復(fù))。MyISAM表提供部分持久性,所有在最后一個FLUSH TABLES命令前進(jìn)行的變化都能保證被存盤。
  www.2cto.com  
3.事務(wù)是由一組SQL語句構(gòu)成的,它由一個用戶輸入,并以修改成持久的或者滾到原來狀態(tài)而終結(jié)。
 
在MySQL中,當(dāng)一個會話開始時,系統(tǒng)變量AUTOCOMMIT值為1,即自動提交功能是打開的,當(dāng)用戶每執(zhí)行一條SQL語句后,該語句對數(shù)據(jù)庫的修改就立即被提交成為持久性修改保存到磁盤上,一個事務(wù)也就結(jié)束了。因此,用戶必須關(guān)閉自動提交,事務(wù)才能由多條SQL語句組成,使用語句:SET@@AUTOCOMMIT=0;執(zhí)行此語句后,必須明確地指示每個事務(wù)的終止,事務(wù)中的SQL語句對數(shù)據(jù)庫所做的修改才能成為持久化修改。例如,執(zhí)行如下語句:
 
DELETE FROM XS WHERE 學(xué)號='081101';
 
SELECT * FROM XS;
 
從執(zhí)行結(jié)果中發(fā)現(xiàn),表中已經(jīng)刪去了一行。但是,這個修改并沒有持久化,因為自動提交已經(jīng)關(guān)閉了。用戶可以通過ROLLBACK撤銷這一修改,或者使用COMMIT語句持久化這一修改。
 
4.  具體介紹如何處理一個事務(wù)。
 
1).  開始事務(wù)
 
當(dāng)一個應(yīng)用程序的第一條SQL語句或者在COMMIT或ROLLBACK語句(后面介紹)后的第一條SQL執(zhí)行后,一個新的事務(wù)也就開始了。另外還可以使用一條start transaction語句來顯示地啟動一個事務(wù)。  語法格式:  START TRANSACTION | BEGINWORK
 
一條BEGIN WORK語句可以用來替代STARTTRANSACTION語句,但是START TRANSACTION更常用些。
 
2).  結(jié)束事務(wù)
 
COMMIT語句是提交語句,它使得自從事務(wù)開始以來所執(zhí)行的所有數(shù)據(jù)修改成為數(shù)據(jù)庫的永久部分,也標(biāo)志一個事務(wù)的結(jié)束,其語法格式為:  COMMIT [WORK]  [AND [NO] CHAIN]  [[NO] RELEASE]
 
說明:可選的and chain子句會在當(dāng)前事務(wù)結(jié)束時,立刻啟動一個新事務(wù),并且新事務(wù)與剛結(jié)束的事務(wù)有相同的隔離等級。Release子句在終止了當(dāng)前事務(wù)后,會讓服務(wù)器斷開與當(dāng)前客戶端的連接。包含NO關(guān)鍵詞可以抑制CHAIN或RELEASE完成。
 
注意:MySQL使用的是平面事務(wù)模型,因此嵌套的事務(wù)是不允許的。在第一個事務(wù)里使用START TRANSACTION命令后,當(dāng)?shù)诙€事務(wù)開始時,自動地提交第一個事務(wù)。同樣,下面的這些MySQL語句運(yùn)行時都會隱式地執(zhí)行一個COMMIT命令:
 
●   DROP DATABASE / DROP TABLE
 
●  CREATE INDEX / DROP INDEX
 
●  ALTER TABLE / RENAME TABLE
 
●  LOCK TABLES / UNLOCK TABLES
 
●  SET AUTOCOMMIT=1
 
3).  撤消事務(wù)
 
Rollback語句是撤銷語句,它撤銷事務(wù)所做的修改,并結(jié)束當(dāng)前這個事務(wù)。   語法格式:
 
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
 
在前面的舉例中,若在最后加上以下這條語句: ROLLBACKWORK;
 
執(zhí)行完這條語句后,前面的刪除動作將被撤銷,可以使用SELECT語句查看該行數(shù)據(jù)是否還原。
 
4).  回滾事務(wù)
  www.2cto.com  
除了撤銷整個事務(wù),用戶還可以使用ROLLBACK TO語句使事務(wù)回滾到某個點,在這之前需要使用savepoint語句來設(shè)置一個保存點。
 
SAVEPOINT語法格式為:  SAVEPOINTidentifier(保存點的名稱)。
 
ROLLBACK TO SAVEPOINT語句會向已命名的保存點回滾一個事務(wù)。如果在保存點被設(shè)置后,當(dāng)前事務(wù)對數(shù)據(jù)進(jìn)行了更改,則這些更改會在回滾中被撤銷。語法格式為:
 
ROLLBACK [WORK] TO SAVEPOINT identifier
 
當(dāng)事務(wù)回滾到某個保存點后,在該保存點之后設(shè)置的保存點將被刪除。RELEASESAVEPOINT語句會從當(dāng)前事務(wù)的一組保存點中刪除已命名的保存點。不出現(xiàn)提交或回滾。如果保存點不存在,會出現(xiàn)錯誤。語法格式為:  RELEASE SAVEPOINT identifier
 
5.  舉例說明:下面幾個語句說明了有關(guān)事務(wù)的處理過程:
 
1. START TRANSACTION
 
2. UPDATE …
 
3. DELETE…
 
4. SAVEPOINT S1;
 
5. DELETE…
 
6. ROLLBACK WORK TO SAVEPOINT S1;
 
7. INSERT…
 
8. COMMIT WORK;
 
說明:在以上語句中,第1行語句開始了一個事務(wù);第2、3行語句對數(shù)據(jù)進(jìn)行了修改,但沒有提交;第4行設(shè)置了一個保存點;第5行刪除了數(shù)據(jù),但沒有提交;第6行將事務(wù)回滾到保存點S1,這時第5行所做修改被撤銷了;第7行修改了數(shù)據(jù);第8行結(jié)束了這個事務(wù),這時第2、3、7行對數(shù)據(jù)庫做的修改被持久化。
 
6.每一個事務(wù)都有一個所謂的隔離級,它定義了用戶彼此之間隔離和交互的程度。前面曾提到,事務(wù)型RDBMS的一個最重要的屬性就是它可以“隔離”在服務(wù)器上正在處理的不同的會話。在單用戶的環(huán)境中,這個屬性無關(guān)緊要:因為在任意時刻只有一個會話處于活動    狀態(tài)。但是在多用戶環(huán)境中,許多RDBMS會話在任一給定時刻都是活動的。在這種情況下,RDBMS能夠隔離事務(wù)是很重要的,這樣它們不互相影響,同時保證數(shù)據(jù)庫性能不受到影響。
  www.2cto.com  
為了了解隔離的重要性,有必要花些時間來考慮如果不強(qiáng)加隔離會發(fā)生什么。如果沒有事務(wù)的隔離性,不同的SELECT語句將會在同一個事務(wù)的環(huán)境中檢索到不同的結(jié)果,因為在這期間,基本上數(shù)據(jù)已經(jīng)被其他事務(wù)所修改。這將導(dǎo)致不一致性,同時很難相信結(jié)果集,從而不能利用查詢結(jié)果作為計算的基礎(chǔ)。因而隔離性強(qiáng)制對事務(wù)進(jìn)行某種程度的隔離,保證應(yīng)用程序在事務(wù)中看到一致的數(shù)據(jù)。
 
基于ANSI/ISO SQL規(guī)范,MySQL提供了下面4種隔離級:序列化(serialization)、可重復(fù)讀(repeatable read)、提交讀(read committed)、未提交讀(read uncommitted)。
 
7.  只有支持事務(wù)的存儲引擎才可以定義一個隔離級。定義隔離級可以使用SET TRANSACTION語句。語法格式:
 
SET [GLOBAL | SESSION] TRANSACTION Isolationlevel
 
            SERIALIZABLE
 
          | REPEATABLE READ
 
          | READ COMMITTED
 
          | READ UNCOMMITTED
 
說明:
 
如果指定GLOBAL,那么定義的隔離級將適用于所有的SQL用戶;如果指定SESSION,則隔離級只適用于當(dāng)前運(yùn)行的會話和連接。MySQL默認(rèn)為REPEATABLE READ隔離級。
 
(1)序列化
 
如果隔離級為序列化,用戶之間通過一個接一個順序地執(zhí)行當(dāng)前的事務(wù)提供了事務(wù)之間最大限度的隔離。
 
(2)可重復(fù)讀
 
在這一級上,事務(wù)不會被看成是一個序列。不過,當(dāng)前在執(zhí)行事務(wù)的變化仍然不能看到,也就是說,如果用戶在同一個事務(wù)中執(zhí)行同條SELECT語句數(shù)次,結(jié)果總是相同的。
 
(3)提交讀
 
READ COMMITTED隔離級的安全性比REPEATABLE READ隔離級的安全性要差。不僅處于這一級的事務(wù)可以看到其他事務(wù)添加的新記錄,而且其他事務(wù)對現(xiàn)存記錄做出的修改一旦被提交,也可以看到。也就是說,這意味著在事務(wù)處理期間,如果其他事務(wù)修改了相應(yīng)的表,那么同一個事務(wù)的多個SELECT語句可能返回不同的結(jié)果。
 
(4)未提交讀
  www.2cto.com  
提供了事務(wù)之間最小限度的隔離。除了容易產(chǎn)生虛幻的讀操作和不能重復(fù)的讀操作外,處于這個隔離級的事務(wù)可以讀到其他事務(wù)還沒有提交的數(shù)據(jù),如果這個事務(wù)使用其他事務(wù)不提交的變化作為計算的基礎(chǔ),然后那些未提交的變化被它們的父事務(wù)撤銷,這就導(dǎo)致了大量的數(shù)據(jù)變化。
 
默認(rèn)情況下,這個系統(tǒng)變量的值是基于每個會話設(shè)置的,但是可以通過向SET命令行添加GLOBAL關(guān)鍵字修改該全局系統(tǒng)變量的值。
 
當(dāng)用戶從無保護(hù)的READUNCOMMITTED隔離級轉(zhuǎn)移到更安全的SERIALIZABLE級時,RDBMS的性能也要受到影響。原因很簡單:用戶要求系統(tǒng)提供越強(qiáng)的數(shù)據(jù)完整性,它就越需要做更多的工作,運(yùn)行的速度也就越慢。因此,需要在RDBMS的隔離性需求和性能之間協(xié)調(diào)。
 
MySQL默認(rèn)為REPEATABLE READ隔離級,這個隔離級適用于大多數(shù)應(yīng)用程序,只有在應(yīng)用程序有具體的對于更高或更低隔離級的要求時才需要改動。沒有一個標(biāo)準(zhǔn)公式來決定哪個隔離級適用于應(yīng)用程序——大多數(shù)情況下,這是一個主觀的決定,它是基于應(yīng)用程序的容錯能力和應(yīng)用者對于潛在數(shù)據(jù)錯誤的影響的判斷。隔離級的選擇對于每個應(yīng)用程序也是沒有標(biāo)準(zhǔn)的。例如,同一個應(yīng)用程序的不同事務(wù)基于執(zhí)行的任務(wù)需要不同的隔離級。

感謝各位的閱讀!關(guān)于“MySQL中事務(wù)是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

本文題目:MySQL中事務(wù)是什么
文章路徑:http://muchs.cn/article4/gecjoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、品牌網(wǎng)站建設(shè)外貿(mào)建站、網(wǎng)站內(nèi)鏈、服務(wù)器托管網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)