Mysql事務處理詳解

2022-09-25 16:12:13 字數 4676 閱讀 8002

一、mysql事務概念

mysql 事務主要用於處理操作量大,複雜度高的資料。由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。在 mysql 中只有使用了 innodb 資料庫引擎的資料庫或表才支援事務。事務用來管理 insert,update,delete 語句。

二、事務特性:atomicity(原子性)、consistency(穩定性,一致性)、隔離性(isolation)和durability(持續性,可靠性)。這四個特性也簡稱acid性。

1.原子性:事務是應用中最小的執行單位,就如原子是自然界最小顆粒,具有不可再分的特徵一樣。事務是應用中不可再分的最小邏輯執行體,一組事務,要麼成功;要麼撤回。

2.穩定性,一致性:事務執行的結果,必須使資料庫從乙個一致性狀態,變到另乙個一致性狀態。當資料庫中只包含事務成功提交的結果時,資料庫處於一致性狀態。一致性是通過原子性來保證的。有非法資料(外來鍵約束之類),事務撤回。

3.隔離性:各個事務的執行互不干擾,任意乙個事務的內部操作對其他併發的事務,都是隔離的。也就是說:併發執行的事務之間不能看到對方的中間狀態,併發執行的事務之間不能相互影響。事務獨立執行。乙個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。

4.持續性,可靠性:持續性也稱為永續性,指事務一旦提交,對資料所做的任何改變,都要記錄到永久儲存器中,通常是儲存進物理資料庫。軟、硬體崩潰後,innodb資料表驅動會利用日誌檔案重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 選項 決定什麼時程式設計客棧候吧事務儲存到日誌裡。

注意事項:儲存引擎myisam不支援事物,儲存引擎innodb支援事物。事務只針對對資料資料產生影響的語句有效。show engines 檢視mysql鎖支援的資料引擎。

三、讀取資料概念

1.髒讀(dirty reads):所謂髒讀就是對髒資料的讀取,而髒資料所指的就是未提交的資料。乙個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條資料是處於待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被稱為髒讀。

2.不可重複讀(non-repeatable reads):乙個事務先後讀取同一條記錄,但兩次讀取的資料不同,我們稱之為不可重複讀。也就是說,這個事務在兩次讀取之間該資料被其它事務所修改。

3.幻讀(phantom reads):乙個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為幻讀。

四、事務隔離級別

修改事務隔離級別語法:

set [session | global] transaction isolation level

1、read uncommitted(未授權讀取、讀未提交):這是最低的隔離等級,允許其他事務看到沒有提交的資料。這種等級會導致髒讀。如果乙個事務已經開始寫資料,則另外乙個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過「排他寫鎖」實現。避免了更新丟失,卻可能出現髒讀。也就是說事務b讀取到了事務a未提交的資料。select語句以非鎖定方式被執行,所以有可能讀到髒資料,隔離級別最低。

set session transaction isolation level read uncommitted ;

set global transaction isolation level read uncommitted;/*全域性建議不用*/

select @@global.tx_isolation;

s程式設計客棧elect @@session.tx_isolation;

select @@tx_isolation;

新建乙個簡單的student表,設定id和name,num欄位,開啟事務1對錶新增通過儲存過程,事務不提交,檢視當前資料庫事務狀態,可以看到一條資料事務,事務級別為read uncommitted:

drop table if exists student;

create table student(

id int primary key auto_increment comment 'id',

name varchar(100) comment '名稱',

num int

);drop procedure if exists proc_on_sw;

delimiter ;;

create procedure proc_on_sw()

begin

start transaction;

insert into student(name,num) value('aaa',1);

select * from information_schema.innodb_trx;

end;;

delimiter ;;

call proc_on_sw();

新建事務2,查詢student表,我們在read uncommitted級別下,可以看到其他事務未提交的資料:再去檢視資料庫事務狀態,我們會看到狀態正常。

start transaction ;

select * from student;

commit;

select * from information_schema.innodb_trx;

2.read committed(授權讀取、讀提交):讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。該隔離級別避免了髒讀,但是卻可能出現不可重複讀。事務a事先讀取程式設計客棧了資料,事務b緊接了更新了資料,並提交了事務,而事務a再次讀取該資料時,資料已經發生了改變。

set session transaction isolation level read committed ;

set global transaction isolation level read committed; /*全域性建議不用*/

drop procedure if exists proc_on_up;

delimiter ;;

create procedure proc_on_up()

begin

set autocommit=0;

update student set name='cc' where id=1;

commit;

set autocommit=1;

end;;

delimiter ;;

call proc_on_up();

select * from student;

3.repeatable read(可重複讀取):就是在開始讀取資料(事務開啟)時,不再允許修改操作,事務開啟,不允許其他事務的update修改操作,不可重複讀對應的是修改,即update操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入insert操作,而不是update操作。避免了不可重複讀取和髒讀,但是有時可能出現幻讀。這可以通過「共享讀鎖」和「排他寫鎖」實現。

set session transaction isolation level repeatable read;

4.序列化、序列化:提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。序列化是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,程式設計客棧事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

set session transaction isolation level serializable;

隔離等級   髒讀   不可重複讀   幻讀

程式設計客棧     讀未提交   yes   yes      yes

讀已提交   no    yes         yes

可重複讀   no    no        yes

序列化       no    no        no

五、完整例子包括提交和回滾完整例子

drop procedure if exists pro_new;

delimiter;;

create procedure pro_new(out rtn int)

begin

declare err int default 0;

-- 如果出現異常,會自動處理並rollback

declare exit handler for sqlexception rollback ;

-- 啟動事務

set autocommit=0;

start transaction;

insert into student(name,num) values(null,2.3);

-- set err = @@identity; -- = 獲取上一次插入的自增id;

set err =last_insert_id(); -- 獲取上一次插入的自增id

insert into student(name,num) values('ccc',err);

-- 執行沒有異常,提交事務

commit;

-- 設定返回值為1

set rtn=1;

set autocommit=1;

end;;

delimiter ;;

set @n=1;

call pro_new(@n);

select @n;

本文標題: mysql事務處理詳解

本文位址:

MySQL事務處理

start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...

mysql事務處理

mysql的事務處理主要有兩種方法 1.用begin,rollback,commit來實現 begin開始乙個事務 rollback事務回滾 commit 事務確認 2.直接用set來改變mysql的自動提交模式 mysql預設是自動提交的,也就是你提交乙個query,就直接執行!可以通過 set ...

mysql事務處理

事務都應該具備acid特徵。所謂acid是atomic 原子性 consistent 一致性 isolated 隔離性 durable 持續性 四個詞的首字母所寫,下面以 銀行轉帳 為例來分別說明一下它們的含義 1 原子性 組成事務處理的語句形成了乙個邏輯單元,不能只執行其中的一部分。換句話說,事務...