MySQL中的事務

2022-09-13 06:45:11 字數 3664 閱讀 3154

一、概念

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!

在mysql中,事務由單獨單元的乙個或多個sql語句組成。在這個單元中,每個mysql語句是相互依賴的。而整個單獨單元作為乙個不可分割的整體,如果單元中某條sql語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的資料將返回到事務開始以前的狀態;如果單元中的所有sql語句均執行成功,則事務被順利執行。

二、事務的四個條件

一般來說,事務是必須滿足4個條件(acid):原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、永續性(durability)。

三、mysql事務的建立與存在週期

建立事務的一般過程是:

如果使用者不在運算元據庫完成後執行事務提交,則系統會預設執行回滾操作。如果使用者在提交事務前選擇撤銷事務,則使用者在撤銷前的所有事務將被取消,資料庫系統會回到初始狀態。

注意:預設情況下,在mysql中建立的資料表型別都是myisam,但是該型別的資料表並不能支援事務。所以,如果使用者想讓資料表支援事務處理能力,必須將當前運算元據表的型別設定為innodb或bdb。

(1)在建立事務的過程中,使用者需要建立乙個innodb或bdb型別的資料表,其基本命令結構如下:

其中,table_name為表名,而field_defintions為表內定義的字段等屬性,type為資料表的型別,既可以是innodb型別,同樣也可以是bdb型別。

alter table table_name type=innodb/bdb;

當使用者更改完表的型別後,即可使資料表支援事務處理。

注意:應用alter table操作可能會導致資料庫中資料丟失,因此為了避免非預期結果出現,在使用alter table命令之前,使用者需要建立乙個表備份。

1、初始化事務

start transaction;

在命令提示符中輸入如下命令:

start transaction;

如果在使用者輸入以上**後,mysql資料庫沒有給出警告提示或返回錯誤資訊,則說明事務初始化成功,使用者可以繼續執行下一步操作。

2、建立事務

應用select語句檢視資料是否被正確輸入

ps:在使用者插入新錶為「innodb」型別或更改原來表型別為「innodb」時,如果在輸入命令提示後,mysql提示「the 'innodb' feature is disabled;you needinnodb' to h**e it working」警告,則說明innodb表型別並沒有被開啟,使用者需要找到mysql檔案目錄下的「my.ini」檔案,定位「skip_innodb」選項位置,將原來的「skip_innodb」改為「#skip_innodb」後儲存該檔案,重新啟動mysql伺服器,即可令資料庫支援「innodb」型別表。 

3、提交事務

在使用者沒有提交事務之前,當其他使用者連線mysql伺服器時,應用select語句查詢結果,則不會顯示沒有提交的事務。當且僅當使用者成功提交事務後,其他使用者才可能通過select語句查詢事務結果,由事務的特性可知,事務具有孤立性,當事務處在處理過程中,其實mysql並未將結果寫入磁碟中,這樣一來,這些正在處理的事務相對其他使用者是不可見的。一旦資料被正確插入,使用者可以使用commit命令提交事務。提交事務的命令結構如下:

commit

一旦當前執行事務的使用者提交當前事務,則其他使用者就可以通過會話查詢結果。

4、撤銷事務(事務回滾)

撤銷事務,又被稱作事務回滾。

即事務被使用者開啟、使用者輸入的sql語句被執行後,如果使用者想要撤銷剛才的資料庫操作,可使用rollback命令撤銷資料庫中的所有變化。rollback命令結構如下:

rollback

輸入回滾操作後,如何判斷是否執行回滾操作了呢?可以通過select語句檢視11.2.2小節中插入的資料是否存在.

如果執行乙個回滾操作,則在輸入start transactiona命令後的所有sql語句都將執行回滾操作。故在執行事務回滾前,使用者需要慎重選擇執行回滾操作。如果使用者開啟事務後,沒有提交事務,則事務預設為自動回滾狀態,即不儲存使用者之前的任何操作。

事務的週期由使用者在命令提示符中輸入start transaction指令開始,直至使用者輸入commit結束

事務不支援巢狀功能,當使用者在未結束第乙個事務又重新開啟乙個事務,則前乙個事務會自動提交,同樣mysql命令中很多命令都會隱藏執行commit命令

回到頂部

在mysql中,存在兩個可以控制行為的變數,它們分別是autocommit變數和transaction isolaction level變數。

在mysql中,如果不更改其自動提交變數,則系統會自動向資料庫提交結果,使用者在執行資料庫操作過程中,不需要使用start transaction語句開始事務,應用commit或者rollback提交事務或執行回滾操作。如果使用者希望通過控制mysql自動提交引數,可以更改提交模式,這一更改過程是通過設定autocommit變數來實現。

下面通過乙個示例向讀者展示如何關閉自動提交引數。在命令提示符中輸入以下命令:

set autocommit=0;

只有當使用者輸入commit命令後,mysql才將資料表中的資料提交到資料庫中,如果不提交事務,而終止mysql會話,資料庫將會自動執行回滾操作。

可以通過檢視「@@autocommit」變數來檢視當前自動提交狀態,檢視此變數select @@autocommit。

基於ansi/iso sql規範,mysql提供4種孤立級:

serializable(序列化)

repeatable read(可重讀)

read committed(提交後讀)

read uncommitted(未提交讀)

在mysql中,可以使用transaction isolation level變數來修改事務孤立級,其中,mysql的預設隔離級別為repeatable read(可重讀),使用者可以使用select命令獲取當前事務孤立級變數的值,其命令如下:

select @@tx_isolation;

如果使用者想要修改事務的隔離級別,必須首先獲取super優先權,以便使用者可以順利執行修改操作,set。

回到頂部

(1)即當兩個或者多個處於不同序列的使用者打算同時更新某相同的資料庫時,因互相等待對方釋放許可權而導致雙方一直處於等待狀態。

(2)在實際應用中,兩個不同序列的客戶打算同時對資料執行操作,極有可能產生死鎖。

(3)更具體地講,當兩個事務相互等待操作對方釋放所持有的資源,而導致兩個事務都無法操作對方持有的資源,這樣無限期的等待被稱作死鎖。

(4)mysql的innodb表處理程式具有檢查死鎖這一功能,如果該處理程式發現使用者在操作過程中產生死鎖,該處理程式立刻通過撤銷操作來撤銷其中乙個事務,以便使死鎖消失。這樣就可以使另乙個事務獲取對方所占有的資源而執行邏輯操作

在mysql中,innodb和bdb型別表可以支援事務處理,但是mysql中myisam型別表並不能支援事務處理,對於某些應用該型別的資料表,使用者可以選擇應用表鎖定來替代事務。這種引用表鎖定來替代事務的事件被稱作偽事務。

使用表鎖定來鎖定表的操作,可以加強非事務表在執行過程的安全性和穩定性。

mysql中事務的特性 mysql中事務的四大特性

原子性 atomicity 事務就像 原子 一樣,不可被分割,組成事務的dml操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。一致性 consistency 一旦事務完成,不管是成功的,還是失敗的,整個系統處於資料一致的狀態。隔離性 isolation 乙個事務的執行不會被另乙個事...

mysql中的事務和鎖 MySQL中的事務和鎖

鎖 行級鎖select for update nowaitfalse,skip false 注意必須用在事物裡面 所有匹配的行將被鎖定,知道事務結束。這意味著可以通過鎖防止資料被其他事務修改。一般情況下如果其他事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。事務事務的四大特性 1.原子性 事務包...

MySql中的事務

一.mysql的事務支援不是繫結在mysql伺服器本身,而是與儲存引擎相關 1.myisam 不支援事務,用於唯讀程式提高效能 2.innodb 支援acid事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...