mysql---事務管理

事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要麼全部成功,要麼全部失敗,是一個整體。MYSQL提供一種機制就是事務,保證我們達到這樣的效果。
舉個例子:
買票系統,
在這裏插入圖片描述
當客戶端1檢查還有一張票的時候,將票賣掉,還沒有執行更新數據庫的時候,客戶端檢查了票數仍然是大於0.於是又賣了一次,然後A將票數更新回數據庫,這時候就出現了同一張票被賣了多次。

  1. 事務的基本操作

例子:銀行轉賬業務

create table account(   
	 id int primary key,   
	 name varchar(50) not null default '',    
	 balance decimal(10, 2) not null default 0.0 
)
  • 開始一個事務
start transaction;
  • 創建一個保存點
savepoint pointname;
  • 回到保存點(根據具體情況)
rollback to 保存點名字;

進行下面操作
在這裏插入圖片描述

  1. 事務操作注意事項
  • 如果沒有設置保存點,也可以回滾,只能回滾到事務的開始,直接使用rollback(前提是事務還沒有提交)
  • 如果一個事務被提交了,則不可以回退
  • 可以選擇回退到那個保存點
  • InnoDB支持事務
  1. 事務的隔離級別
    當我們又多個客戶端同時操作數據庫的某張表的時候,MySQL提供了隔離級別。
    當MySQL表被多個線程或者客戶端開啓各自事務操作數據表中的數據的時候,MySQL提供了一種機制,可以讓不同的事務才操作數據的時候,具有隔離性,從而保證數據的一致性。

  2. 無隔離性的問題

  • 髒讀

是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務 也訪問這個數據,然後使用了這個數據。

  • 不可重複度
    是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一 個事務中的兩次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的數據可能是不一樣的。這樣就 發生了在一個事務內兩次讀到的數據是不一樣的,因此稱爲是不可重複讀。(即不能讀到相同的數據內容)

  • 幻讀
    是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中 的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發 生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。

  1. 事務的隔離級別

在這裏插入圖片描述

  • 設置事務的隔離級別
set session transaction isolation level read uncommitted;
  • 隔離級別
    在這裏插入圖片描述

  • 當客戶端在執行select過程中,DBMS會對庫加鎖,這時候客戶端如果執行插入,只要還沒釋放鎖,插入不進去,會將B的UPDATE語句放在等待隊列中,直到釋放了鎖或者超時。

  1. 事務的ACDID特性
  • 原子性:事務是應用中最小的執行單位,就如原子是自然界的最小顆粒,具有不可再分的特徵一樣,事務是應用中不可再分 的最小邏輯執行體。
  • 一致性:事務執行的結果,必須使數據庫從一個一致性狀態,變到另一個一致性狀態。當數據庫只包含事務成功提交的結果 時,數據庫處於一致性狀態。如果系統運行發生中斷,某個事務尚未完成而被迫中斷,而改未完成的事務對數據庫 所做的修改已被寫入數據庫,此時數據庫就處於一種不正確(不一致)的狀態。因此一致性是通過原子性來保證 的。
  • 隔離性:各個事務的執行互不干擾,任意一個事務的內部操作對其他併發事務都是隔離的。也就是說,併發執行的事務之間 不能看到對方的中間狀態,併發執行的事務之間不能互相影響
  • 持久性:持久性是指一個事務一旦被提交,它對數據庫所做的改變都要記錄到永久存儲其中(如:磁盤)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章