Mysql事務處理詳細講解及完整實例下載

来源:http://www.cnblogs.com/sztx/archive/2017/08/15/7361954.html
-Advertisement-
Play Games

Mysql事務概念:MySQL 事務主要用於處理操作量大,複雜度高的數據。事務特性:Atomicity(原子性)、Consistency(穩定性,一致性)、隔離性(Isolation)和Durability(持續性,可靠性)四個特性講解分析。讀取數據概念從三個方面詳細講解分析。從Mysql事務隔離級... ...


一、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 {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

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

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對錶新增通過存儲過程,事務不提交,查看當前資料庫事務狀態,可以看到一條數據事務,事務級別為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;

全部實例sql文件下載地址:http://pan.baidu.com/s/1eSIj5Fc

密碼:2vyi


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spinner使用一 一、使用方法 1、在layout中創建Spinner控制項 <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" / ...
  • 首先你要花點時間針對objective-c語言的學習;畢竟這個是iOS開發的基礎(你也可以嘗試用Swift,但此項目只是針對OC),編程套路其實都是差不多,多寫多想多實踐;關於環境的搭建就不在本文進行介紹,這部分內容可以自行百度或谷歌,都有相應的說明; 對於一個剛入門總是希望有個完整的項目可以直接運 ...
  • 原生的,也不知道會不會用到,以前的筆記。 文件夾管理 1、拿到文件管理者單例 2、使用管理者創建文件夾 3、創建文件 4、讀取文件信息 5、讀取文件返回的字典信息 6、文件讀取 6-1)、方法1: 6-2)、方法2: 7、文件移動(剪切、重命名) 8、文件複製 9、文件刪除 文件操作 ...
  • iOS雖然也有SQL,不過用得少(至少我目前是這樣)。大數據直接丟給後臺,小的用Plist足矣。 再退一步,有FMDB,原生的也用得少了。 下麵是之前學SQL時候的筆記。 1、創建 1-1)、打開: 資料庫指針、保存地址 1-2)、創建: 資料庫指針、創建指令、錯誤指令 1-3)、關閉: 資料庫指針 ...
  • 另一個大嬸寫的關於抽屜的博文: http://blog.csdn.net/lu1024188315/article/details/73608616 今天參考大灰狼得博客,好好得總結一下navigation得用法。以前總是看官方文檔,但理解得不太透測。 一、開源庫介紹 今年1月份,新開源的React ...
  • 今天在android studio上打包項目時,遇到了Error:Execution failed for task ':app:transformClassesWithDexForRelease這麼個錯誤,記得之前也遇到過這種問題,卻如何想不起怎麼解決的,只好再次在網上查資料,總算是解決了 這個問 ...
  • 對於剛開始學習Android的小白來說,listview,gridview這些控制項是必須熟悉的,但是熟悉熟練的使用這些控制項並不能代表你就可以完成開發,比如列表的展示,使用listview, gridview,RecyclerView都是可以的,那麼他們的區別在哪裡呢?最近自己負責的業務就需要用到列表 ...
  • (1)下載二維碼的庫源碼 鏈接:http://pan.baidu.com/s/1pKQyw2n 密碼:r5bv 下載完成後打開可以看到 libzxing 的文件夾,最後添加進 Android Studio,操作 :File 》New 》Import Moudle (2)按鈕單擊事件為 scanner ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...