最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql事務處理詳解

 更新時間:2017年08月15日 08:58:59   作者:代碼成就未來  
什么是事務處理呢??事務處理是用來維護數(shù)據(jù)庫的完整性的,它保證成批的MySQL操作要么完全執(zhí)行,要么完成不執(zhí)行。

一、Mysql事務概念

 MySQL 事務主要用于處理操作量大,復雜度高的數(shù)據(jù)。由一步或幾步數(shù)據(jù)庫操作序列組成邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務。事務用來管理 insert,update,delete 語句。

二、事務特性:Atomicity(原子性)、Consistency(穩(wěn)定性,一致性)、隔離性(Isolation)和Durability(持續(xù)性,可靠性)。這四個特性也簡稱ACID性。

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

  2.穩(wěn)定性,一致性:事務執(zhí)行的結果,必須使數(shù)據(jù)庫從一個一致性狀態(tài),變到另一個一致性狀態(tài)。當數(shù)據(jù)庫中只包含事務成功提交的結果時,數(shù)據(jù)庫處于一致性狀態(tài)。一致性是通過原子性來保證的。有非法數(shù)據(jù)(外鍵約束之類),事務撤回。

  3.隔離性:各個事務的執(zhí)行互不干擾,任意一個事務的內部操作對其他并發(fā)的事務,都是隔離的。也就是說:并發(fā)執(zhí)行的事務之間不能看到對方的中間狀態(tài),并發(fā)執(zhí)行的事務之間不能相互影響。事務獨立運行。一個事務處理后的結果,影響了其他事務,那么其他事務會撤回。事務的100%隔離,需要犧牲速度。

  4.持續(xù)性,可靠性:持續(xù)性也稱為持久性,指事務一旦提交,對數(shù)據(jù)所做的任何改變,都要記錄到永久存儲器中,通常是保存進物理數(shù)據(jù)庫。軟、硬件崩潰后,InnoDB數(shù)據(jù)表驅動會利用日志文件重構修改??煽啃院透咚俣炔豢杉娴?, innodb_flush_log_at_trx_commit 選項 決定什么時候吧事務保存到日志里。

  注意事項:存儲引擎MyISAM不支持事物,存儲引擎InnoDB支持事物。事務只針對對數(shù)據(jù)數(shù)據(jù)產(chǎn)生影響的語句有效。show engines 查看mysql鎖支持的數(shù)據(jù)引擎。

三、讀取數(shù)據(jù)概念

  1.臟讀(Dirty Reads):所謂臟讀就是對臟數(shù)據(jù)的讀取,而臟數(shù)據(jù)所指的就是未提交的數(shù)據(jù)。一個事務正在對一條記錄做修改,在這個事務完成并提交之前,這條數(shù)據(jù)是處于待定狀態(tài)的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的數(shù)據(jù),并據(jù)此做進一步的處理,就會產(chǎn)生未提交的數(shù)據(jù)依賴關系。這種現(xiàn)象被稱為臟讀。

  2.不可重復讀(Non-Repeatable Reads):一個事務先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復讀。也就是說,這個事務在兩次讀取之間該數(shù)據(jù)被其它事務所修改。

  3.幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為幻讀。

四、事務隔離級別

  修改事務隔離級別語法:
  SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

  1、Read Uncommitted(未授權讀取、讀未提交):這是最低的隔離等級,允許其他事務看到?jīng)]有提交的數(shù)據(jù)。這種等級會導致臟讀。如果一個事務已經(jīng)開始寫數(shù)據(jù),則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數(shù)據(jù)。該隔離級別可以通過“排他寫鎖”實現(xiàn)。避免了更新丟失,卻可能出現(xiàn)臟讀。也就是說事務B讀取到了事務A未提交的數(shù)據(jù)。SELECT語句以非鎖定方式被執(zhí)行,所以有可能讀到臟數(shù)據(jù),隔離級別最低。

SET session transaction isolation level read uncommitted ;
SET global transaction isolation level read uncommitted;/*全局建議不用*/
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

  新建一個簡單的student表,設置id和name,num字段,開啟事務1對表新增通過存儲過程,事務不提交,查看當前數(shù)據(jù)庫事務狀態(tài),可以看到一條數(shù)據(jù)事務,事務級別為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級別下,可以看到其他事務未提交的數(shù)據(jù):再去查看數(shù)據(jù)庫事務狀態(tài),我們會看到狀態(tài)正常。

start transaction ;
select * from student;
commit;
select * from information_schema.INNODB_TRX;

  2.Read Committed(授權讀取、讀提交):讀取數(shù)據(jù)的事務允許其他事務繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務將會禁止其他事務訪問該行。該隔離級別避免了臟讀,但是卻可能出現(xiàn)不可重復讀。事務A事先讀取了數(shù)據(jù),事務B緊接了更新了數(shù)據(jù),并提交了事務,而事務A再次讀取該數(shù)據(jù)時,數(shù)據(jù)已經(jīng)發(fā)生了改變。

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(可重復讀取):就是在開始讀取數(shù)據(jù)(事務開啟)時,不再允許修改操作,事務開啟,不允許其他事務的UPDATE修改操作,不可重復讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。避免了不可重復讀取和臟讀,但是有時可能出現(xiàn)幻讀。這可以通過“共享讀鎖”和“排他寫鎖”實現(xiàn)。

set session transaction isolation level repeatable read;

  4.串行化、序列化:提供嚴格的事務隔離。它要求事務序列化執(zhí)行,事務只能一個接著一個地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級鎖”是無法實現(xiàn)事務序列化的,必須通過其他機制保證新插入的數(shù)據(jù)不會被剛執(zhí)行查詢操作的事務訪問到。序列化是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用,在該級別下,事務順序執(zhí)行,不僅可以避免臟讀、不可重復讀,還避免了幻像讀。

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;
-- 如果出現(xiàn)異常,會自動處理并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;

相關文章

  • 優(yōu)化MySQL Join算法的性能的操作方法

    優(yōu)化MySQL Join算法的性能的操作方法

    本文介紹了優(yōu)化MySQL JOIN算法性能的多種方法,包括索引優(yōu)化、表結構設計、查詢語句優(yōu)化和系統(tǒng)配置調整,通過合理創(chuàng)建索引、優(yōu)化表結構、選擇合適的驅動表以及調整相關系統(tǒng)參數(shù),可以有效提高JOIN操作的性能,感興趣的朋友一起看看吧
    2025-02-02
  • mysql 8.0.18 壓縮包安裝及忘記密碼重置所遇到的坑

    mysql 8.0.18 壓縮包安裝及忘記密碼重置所遇到的坑

    這篇文章主要介紹了mysql 8.0.18 壓縮包安裝及忘記密碼重置所遇到的坑,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • MySQL 查詢某個字段不重復的所有記錄

    MySQL 查詢某個字段不重復的所有記錄

    現(xiàn)在想從這5條記錄中查詢所有title不重復的記錄
    2009-05-05
  • MySQL配置文件my.cnf與my.ini的區(qū)別

    MySQL配置文件my.cnf與my.ini的區(qū)別

    在使用MySQL時,我們需要對其進行配置,以滿足我們的需求,本文主要介紹了MySQL配置文件my.cnf與my.ini的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • CentOS系統(tǒng)中MySQL5.1升級至5.5.36

    CentOS系統(tǒng)中MySQL5.1升級至5.5.36

    有相關測試數(shù)據(jù)說明從5.1到5.5+,MySQL性能會有明顯的提升,具體的需要自己建立測試環(huán)境去實踐下,今天我們就來操作下,并記錄下來升級的具體步驟
    2017-07-07
  • MySQL查看數(shù)據(jù)庫連接數(shù)的方法

    MySQL查看數(shù)據(jù)庫連接數(shù)的方法

    本文主要介紹了MySQL查看數(shù)據(jù)庫連接數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • MySQL如何開啟用戶遠程登錄權限

    MySQL如何開啟用戶遠程登錄權限

    這篇文章主要介紹了MySQL如何開啟用戶遠程登錄權限問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Linux下修改MySQL編碼的方法

    Linux下修改MySQL編碼的方法

    有時候因為編碼需要修改mysql的編碼,windows下修改有圖文界面簡單一些,linux大家就可以參考下面的方法
    2012-04-04
  • mysql 循環(huán)insert方式

    mysql 循環(huán)insert方式

    這篇文章主要介紹了mysql 循環(huán)insert方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 解決ERROR?2003?(HY000):?Can‘t?connect?to?MySQL?server?on?‘localhost‘?(111)的問題

    解決ERROR?2003?(HY000):?Can‘t?connect?to?MySQL?server?

    在Windows系統(tǒng)上使用Django連接Ubuntu虛擬機中的MySQL數(shù)據(jù)庫時,遇到無法連接的問題,排查后發(fā)現(xiàn)是由于MySQL綁定的IP地址改變導致的,下面就來介紹一下問題解決,感興趣的可以了解一下
    2024-09-09

最新評論

颍上县| 巨野县| 三河市| 揭东县| 改则县| 阳高县| 寿阳县| 景德镇市| 九江市| 尖扎县| 玉田县| 伊宁县| 青田县| 阜城县| 石阡县| 邹城市| 监利县| 平湖市| 平泉县| 红原县| 方正县| 淳安县| 平定县| 开封县| 仁寿县| 盐源县| 揭阳市| 榆林市| 宁蒗| 科尔| 孟连| 海门市| 南城县| 诸暨市| 永康市| 德保县| 林州市| 荆门市| 德惠市| 商城县| 岚皋县|