




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第mysql事務管理及python操作在用戶操作MySQL過程中,對于一般簡單的業(yè)務邏輯或中小型程序而言,無需考慮應用MySQL事務。但在比較復雜的情況下,往往用戶在執(zhí)行某些數(shù)據(jù)操作過程中,需要通過一組SQL語句執(zhí)行多項并行業(yè)務邏輯或程序,這樣,就必須保證所用命令執(zhí)行的同步性。使執(zhí)行序列中,產(chǎn)生依靠關(guān)系的動作能夠同時操作成功或同時返回初始狀態(tài)。在此情況下,就需要用戶優(yōu)先考慮使用MySQL事務處理。
在MySQL中,事務由單獨單元的一個或多個SQL語句組成。在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執(zhí)行失敗或產(chǎn)生錯誤,整個單元將會回滾。所有受到影響的數(shù)據(jù)將返回到事務開始以前的狀態(tài);如果單元中的所有SQL語句均執(zhí)行成功,則事務被順利執(zhí)行。
通過InnoDB和BDB類型表,MySQL事務能夠完全滿足事務安全的ACID測試,但是并不是所有表類型都支持事務,如MyISAM類型表就不能支持事務,只能通過偽事務對表實現(xiàn)事務處理。
MySQL事務的創(chuàng)建與存在周期
創(chuàng)建事務
創(chuàng)建事務的一般過程是:初始化事務、創(chuàng)建事務、應用SELECT語句查詢數(shù)據(jù)是否被錄入和提交事務。如果用戶不在操作數(shù)據(jù)庫完成后執(zhí)行事務提交,則系統(tǒng)會默認執(zhí)行回滾操作。如果用戶在提交事務前選擇撤銷事務,則用戶在撤銷前的所有事務將被取消,數(shù)據(jù)庫系統(tǒng)會回到初始狀態(tài)。
默認情況下,在MySQL中創(chuàng)建的數(shù)據(jù)表類型都是MyISAM,但是該類型的數(shù)據(jù)表并不能支持事務。所以,如果用戶想讓數(shù)據(jù)表支持事務處理能力,必須將當前操作數(shù)據(jù)表的類型設(shè)置為InnoDB或BDB。
在創(chuàng)建事務的過程中,用戶需要創(chuàng)建一個InnoDB或BDB類型的數(shù)據(jù)表,其基本命令結(jié)構(gòu)如下:
CREATETABLEtable_name(field-defintions)TYPE=INNODB/BDB;
其中,table_name為表名,而field_defintions為表內(nèi)定義的字段等屬性,TYPE為數(shù)據(jù)表的類型,既可以是InnoDB類型,同樣也可以是BDB類型。
當用戶希望已經(jīng)存在的表支持事務處理,則可以應用ALTERTABLE命令指定數(shù)據(jù)表的類型實現(xiàn)對表的類型更改操作,使原本不支持事務的數(shù)據(jù)表更改為支持事務處理的類型。其命令如下:
ALTERTABLEtable_nameTYPE=INNODB/BDB;
當用戶更改完表的類型后,即可使數(shù)據(jù)表支持事務處理。
應用ALTERTABLE操作可能會導致數(shù)據(jù)庫中數(shù)據(jù)丟失,因此為了避免非預期結(jié)果出現(xiàn),在使用ALTERTABLE命令之前,用戶需要創(chuàng)建一個表備份。
初始化事務
初始化MySQL事務,首先聲明初始化MySQL事務后所有的SQL語句為一個單元。在MySQL中,應用STARTTRANSACTION命令來標記一個事務的開始。初始化事務的結(jié)構(gòu)如下:
STARTTRANSACTION;
另外,用戶也可以使用BEGIN或者BEGINWORK命令初始化事務,通常STARTTRANSACTION命令后面跟隨的是組成事務的SQL語句。
在命令提示符中輸入如下命令:
starttransaction;
如果在用戶輸入以上代碼后,MySQL數(shù)據(jù)庫沒有給出警告提示或返回錯誤信息,則說明事務初始化成功,用戶可以繼續(xù)執(zhí)行下一步操作。
創(chuàng)建事務
insertintoconnection(emAIl,cellphone,QQ,sid)
values(barrystephen@126.com187034000,3);
應用SELECT語句查看數(shù)據(jù)是否被正確輸入
SELECT*FROMconnectionWHEREsid=3;
ps:在用戶插入新表為InnoDB類型或更改原來表類型為InnoDB時,如果在輸入命令提示后,MySQL提示TheInnoDBfeatureisdisabled;youneedInnoDBtohaveitworking警告,則說明InnoDB表類型并沒有被開啟,用戶需要找到MySQL文件目錄下的my.ini文件,定位skip_innodb選項位置,將原來的skip_innodb改為#skip_innodb后保存該文件,重新啟動MySQL服務器,即可令數(shù)據(jù)庫支持InnoDB類型表。
提交事務
在用戶沒有提交事務之前,當其他用戶連接MySQL服務器時,應用SELECT語句查詢結(jié)果,則不會顯示沒有提交的事務。當且僅當用戶成功提交事務后,其他用戶才可能通過SELECT語句查詢事務結(jié)果,由事務的特性可知,事務具有孤立性,當事務處在處理過程中,其實MySQL并未將結(jié)果寫入磁盤中,這樣一來,這些正在處理的事務相對其他用戶是不可見的。一旦數(shù)據(jù)被正確插入,用戶可以使用COMMIT命令提交事務。提交事務的命令結(jié)構(gòu)如下:
COMMIT
一旦當前執(zhí)行事務的用戶提交當前事務,則其他用戶就可以通過會話查詢結(jié)果。
撤銷事務(事務回滾)
撤銷事務,又被稱作事務回滾。即事務被用戶開啟、用戶輸入的SQL語句被執(zhí)行后,如果用戶想要撤銷剛才的數(shù)據(jù)庫操作,可使用ROLLBACK命令撤銷數(shù)據(jù)庫中的所有變化。ROLLBACK命令結(jié)構(gòu)如下:
ROLLBACK
輸入回滾操作后,如何判斷是否執(zhí)行回滾操作了呢?可以通過SELECT語句查看11.2.2小節(jié)中插入的數(shù)據(jù)是否存在.
如果執(zhí)行一個回滾操作,則在輸入STARTTRANSACTIONA命令后的所有SQL語句都將執(zhí)行回滾操作。故在執(zhí)行事務回滾前,用戶需要慎重選擇執(zhí)行回滾操作。如果用戶開啟事務后,沒有提交事務,則事務默認為自動回滾狀態(tài),即不保存用戶之前的任何操作。
事務的存在周期
事務的周期由用戶在命令提示符中輸入STARTTRANSACTION指令開始,直至用戶輸入COMMIT結(jié)束.
事務不支持嵌套功能,當用戶在未結(jié)束第一個事務又重新打開一個事務,則前一個事務會自動提交,同樣MySQL命令中很多命令都會隱藏執(zhí)行COMMIT命令。
MySQL行為
在MySQL中,存在兩個可以控制行為的變量,它們分別是AUTOCOMMIT變量和TRANSACTIONISOLACTIONLEVEL變量。
自動提交
在MySQL中,如果不更改其自動提交變量,則系統(tǒng)會自動向數(shù)據(jù)庫提交結(jié)果,用戶在執(zhí)行數(shù)據(jù)庫操作過程中,不需要使用STARTTRANSACTION語句開始事務,應用COMMIT或者ROLLBACK提交事務或執(zhí)行回滾操作。如果用戶希望通過控制MySQL自動提交參數(shù),可以更改提交模式,這一更改過程是通過設(shè)置AUTOCOMMIT變量來實現(xiàn)。
下面通過一個示例向讀者展示如何關(guān)閉自動提交參數(shù)。在命令提示符中輸入以下命令:
SETAUTOCOMMIT=0;
只有當用戶輸入COMMIT命令后,MySQL才將數(shù)據(jù)表中的資料提交到數(shù)據(jù)庫中,如果不提交事務,而終止MySQL會話,數(shù)據(jù)庫將會自動執(zhí)行回滾操作。
可以通過查看@@AUTOCOMMIT變量來查看當前自動提交狀態(tài),查看此變量SELECT@@AUTOCOMMIT。
事務的隔離級別
基于ANSI/ISOSQL規(guī)范,MySQL提供4種孤立級:
SERIALIZABLE(序列化)
REPEATABLEREAD(可重讀)
READCOMMITTED(提交后讀)
READUNCOMMITTED(未提交讀)
在MySQL中,可以使用TRANSACTIONISOLATIONLEVEL變量來修改事務孤立級,其中,MySQL的默認隔離級別為REPEATABLEREAD(可重讀),用戶可以使用SELECT命令獲取當前事務孤立級變量的值,其命令如下:
SELECT@@tx_isolation;
如果用戶想要修改事務的隔離級別,必須首先獲取SUPER優(yōu)先權(quán),以便用戶可以順利執(zhí)行修改操作,set。
事務的使用技巧和注意事項
應用小事務,保證每個事務不會在執(zhí)行前等待很長時間,從而避免各個事務因為互相等待而導致系統(tǒng)性能的大幅度下降。
選擇合適的孤立級,因為事務的性能與其對服務器產(chǎn)生的負載成反比,即當事務孤立級越高,其性能越低,但是其安全性也越高。只有選擇適當?shù)墓铝⒓?,才能有效地提高MySQL系統(tǒng)性能和應用性。
死鎖的概念與避免,即當兩個或者多個處于不同序列的用戶打算同時更新某相同的數(shù)據(jù)庫時,因互相等待對方釋放權(quán)限而導致雙方一直處于等待狀態(tài)。在實際應用中,兩個不同序列的客戶打算同時對數(shù)據(jù)執(zhí)行操作,極有可能產(chǎn)生死鎖。更具體地講,當兩個事務相互等待操作對方釋放所持有的資源,而導致兩個事務都無法操作對方持有的資源,這樣無限期的等待被稱作死鎖。MySQL的InnoDB表處理程序具有檢查死鎖這一功能,如果該處理程序發(fā)現(xiàn)用戶在操作過程中產(chǎn)生死鎖,該處理程序立刻通過撤銷操作來撤銷其中一個事務,以便使死鎖消失。這樣就可以使另一個事務獲取對方所占有的資源而執(zhí)行邏輯操作。
MySQL偽事務
在MySQL中,InnoDB和BDB類型表可以支持事務處理,但是MySQL中MyISAM類型表并不能支持事務處理,對于某些應用該類型的數(shù)據(jù)表,用戶可以選擇應用表鎖定來替代事務。這種引用表鎖定來替代事務的事件被稱作偽事務。使用表鎖定來鎖定表的操作,可以加強非事務表在執(zhí)行過程的安全性和穩(wěn)定性。
用表鎖定代替事務
在MySQL的MyISAM類型數(shù)據(jù)表中,并不支持COMMIT(提交)和ROLLBACK(回滾)命令。當用戶對數(shù)據(jù)庫執(zhí)行插入、刪除、更新等操作時,這些變化的數(shù)據(jù)都被立刻保存在磁盤中。這樣,在多用戶環(huán)境中,會導致諸多問題。為了避免同一時間有多個用戶對數(shù)據(jù)庫中指定表進行操作,可以應用表鎖定來避免在用戶操作數(shù)據(jù)表過程中受到干擾。當且僅當該用戶釋放表的操作鎖定后,其他用戶才可以訪問這些修改后的數(shù)據(jù)表。
設(shè)置表鎖定代替事務基本步驟如下:
(1)為指定數(shù)據(jù)表添加鎖定。其語法如下:
LOCKTABLEStable_namelock_type,
其中,table_name為被鎖定的表名,lock_type為鎖定類型,該類型包括以讀方式(READ)鎖定表,以寫方式(WRITE)鎖定表。
(2)用戶執(zhí)行數(shù)據(jù)表的操作,可以添加、刪除或者更改部分數(shù)據(jù)。
(3)用戶完成對鎖定數(shù)據(jù)表的操作后,需要對該表進行解鎖操作,釋放該表的鎖定狀態(tài)。其語法如下:
UNLOCKTABLES
以讀方式鎖定數(shù)據(jù)表,該方式是設(shè)置鎖定用戶的其他方式操作,如刪除、插入、更新都不被允許,直至用戶進行解鎖操作。
locktablestudentinforead;
其中的lock_type參數(shù)中,用戶指定數(shù)據(jù)表以讀方式(READ)鎖定數(shù)據(jù)表的變體為READLOCAL鎖定,其與READ鎖定的不同點是,該參數(shù)所指定的用戶會話可以執(zhí)行INSERT操作,它是為了使用MySQLdump工具而創(chuàng)建的一種變體形式。
以寫方式鎖定數(shù)據(jù)表,該方式是是設(shè)置用戶可以修改數(shù)據(jù)表中的數(shù)據(jù),但是除自己以外其他會話中的用戶不能進行任何讀操作。在命令提示符中輸入如下命令:
locktablestudentinfowrite;
當數(shù)據(jù)表被釋放鎖定后,其他訪問數(shù)據(jù)庫的用戶即可查看數(shù)據(jù)表的內(nèi)容。
應用表鎖實現(xiàn)偽事務
通過使用表鎖定對MyISAM表進行鎖定操作,以此過程來代替事務型表InnoDB,即應用表鎖定來實現(xiàn)偽事務。實現(xiàn)偽事務的一般步驟如下:
(1)對數(shù)據(jù)庫中的數(shù)據(jù)表進行鎖定操作,可以對多個表做不同的方式鎖定,其代碼格式如下:
LOCKTABLEtable_name1lock_type1,table_name2lock_type2,
(2)執(zhí)行數(shù)據(jù)庫操作,向鎖定的數(shù)據(jù)表中執(zhí)行添加、刪除、修改操等操作。
如前面提到的INSERT、UPDATE、DELETE等操作。用戶可以對鎖定的數(shù)據(jù)表執(zhí)行上述操作,在執(zhí)行過程中,該偽事務所產(chǎn)生的結(jié)果是不會被其他用戶更改的。
(3)釋放鎖定的數(shù)據(jù)表,以便讓正在隊列中等待查看或操作的其他用戶可以瀏覽數(shù)據(jù)表中的數(shù)據(jù)或?qū)Σ僮鞅韴?zhí)行各種數(shù)據(jù)的操作。
如果存在其他會話要求訪問已鎖定的多個表格,則該會話必須被迫等待當前鎖定用戶釋放鎖定表。才允許其他會話訪問該數(shù)據(jù)表,表鎖定使不同會話執(zhí)行的數(shù)據(jù)庫操作彼此獨立。應用數(shù)據(jù)表鎖定方式可以使不支持事務類型的表實現(xiàn)偽事務。
Python執(zhí)行MySQL事務
一、MySQL事務
事務就是指邏輯上的一組SQL操作,組成這組操作的各個SQL語句,執(zhí)行時要么全成功要么全失敗。
舉個例子,小明給小紅轉(zhuǎn)賬100元,轉(zhuǎn)賬過程實際上就是小明的賬戶減少100元,小紅的賬戶增加100元,對應的SQL語句為:
updateaccountsetmoney=money-5wherename=xiaoming
updateaccountsetmoney=money+5wherename=xiaohong
上述的兩條SQL操作,在事務中的操作就是要么都執(zhí)行成功,要么都執(zhí)行失敗,如果只有第一條成功,那么小明就損失100元,而小紅并沒有收到100元,這是不可取的,所以這就是事務,事務就是指邏輯上的一組SQL操作,組成這組操作的各個SQL語句,執(zhí)行時要么全成功要么全失敗。事務處理可以用來維護數(shù)據(jù)庫的完整性,保證成批的SQL語句要么全部執(zhí)行,要么全部不執(zhí)行,在MySQL中只有使用了Innodb庫引擎的數(shù)據(jù)庫或表才支持事務,所以很多情況下我們都使用Innodb引擎.
事務的特性如下:
原子性:事務是一個不可分割的單位,事務中的所有SQL操作要么都成功,要么都失敗
一致性:事務發(fā)生前和發(fā)生后,數(shù)據(jù)的完整性必須保持一致
隔離性:當并發(fā)訪問數(shù)據(jù)庫時,一個正在執(zhí)行的事務在執(zhí)行完畢前,對于其它的會話是不可見的,多個并發(fā)事務之間的數(shù)據(jù)是相互隔離的
持久性:一個事務一旦被提交,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久性的,如果出了錯誤,事務也不允許撤銷,只能通過補償性事務
mysqlbegin#開啟事務
mysqlrollback#回滾事務
mysqlcommit#提交事務
數(shù)據(jù)庫默認事務是自動提交的,也就是說,當我們執(zhí)行select,insert,update,delete等操作時,就會自動提交事務,如果關(guān)閉事務的自動提交,那么我們執(zhí)行完select,insert,update,delete操作后需要再執(zhí)行commit來提交事務,否則就不會執(zhí)行
二、游標
游標是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果,用法如下:
In[1]:importpymysql
In[2]:c=MySQLdb.connect(user=root,passwd=root,db=test)#連接數(shù)據(jù)庫
In[3]:cus=c.cursor()#創(chuàng)建一個游標對象
In[4]:cus.execute(select*fromuser;)#使用exec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保育老師健康知識培訓
- 項目工程應急演練課件
- 《平面設(shè)計》課件-第6章 設(shè)計符號學基礎(chǔ)
- 音樂信息技術(shù)課件
- 市政污水管網(wǎng)改造項目建設(shè)管理方案(模板范文)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)工程運營管理方案(模板范文)
- xx片區(qū)城鄉(xiāng)供水一體化項目規(guī)劃設(shè)計方案(范文參考)
- 2025年氯鉑酸合作協(xié)議書
- 基于風險指標的低壓設(shè)備退役優(yōu)化及其在新加坡電網(wǎng)中的應用
- 2025年專用小麥新品種項目合作計劃書
- 手工編織團建活動方案
- GB 17051-2025二次供水設(shè)施衛(wèi)生規(guī)范
- 四川省眉山市東坡區(qū) 2024-2025學年七年級下學期期末道德與法治試卷(含答案)
- 2025至2030中國生物質(zhì)鍋爐行業(yè)當前競爭現(xiàn)狀及未來應用規(guī)模預測報告
- 少兒健康運動課件
- 應急救援無人機系統(tǒng)應用解析
- 2025年廣西公需科目答案01
- JJF1033-2023計量標準考核規(guī)范
- 三級安全教育登記卡(新)
- 少兒美術(shù)國畫- 少兒希望 《紫藤課件》
- 建立良好的同伴關(guān)系-課件-高二心理健康
評論
0/150
提交評論