真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL中事務(wù)是什么

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

創(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ù)由作為一個(gè)單獨(dú)單元的一個(gè)或多個(gè)SQL語句組成。這個(gè)單元中的每個(gè)SQL語句是互相依賴的,而且單元作為一個(gè)整體是不可分割的。如果單元中的一個(gè)語句不能完成,整個(gè)單元就會(huì)回滾(撤銷),所有影響到的數(shù)據(jù)將返回到事務(wù)開始以前的狀態(tài)。因而,只有事務(wù)中的所有語句都成功地執(zhí)行才能說這個(gè)事務(wù)被成功地執(zhí)行。

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

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


當(dāng)前標(biāo)題:MySQL中事務(wù)是什么
網(wǎng)站路徑:http://weahome.cn/article/gecjoe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部