MYSQL事務處理

什麼叫事務?

開高級程序開發設計中,不免會有數據庫的寫入和輸出,有些時候考慮到寫入多個數據在其中一個業務內進行排查和修改,萬一在邏輯下其中一行在數據或者邏輯報錯,會致使以前寫入的內容原封不動在數據庫裏面mysql

這樣子會致使, 程序拋出異常,錯誤的數據完整無缺保存到數據庫.

事務簡單來講,就是處理一件數據庫事情
俗稱數據庫事務(Datebase Transaction)
是在程序設計內一段(單元)內容進行操做
複製代碼

事務的四大特性

  • 原子性(atomicity):一個事務內是徹底獨立,不可分割的sql

  • 隔離性(isoation):事務內容不能被其餘事務被幹擾數據庫

  • 一致性(consistenc):事務必須從一個一致性狀態轉爲另一個一致性安全

  • 持久性(durability):一個事務一旦提交,它的數據庫的影響是永久的bash

Mysql事務處理

show engines; --查看數據庫引擎
default-storage-engine = Innodb --my.ini修改引擎
複製代碼

在Mysql 5.2以後帶Innodb數據庫引擎數據才能使用事務處理 通常Mysql默認事務爲自動提交(autocommit)服務器

begin; --開啓事務(START TANSACTION)
commit; --提交事務
rollback; --回滾事務
複製代碼

回到剛剛的程序設計邏輯裏面
在數據寫入前,事務改成手動提交(begin),若是業務邏輯中途出錯,捕捉異常,而後吧數據迴歸到原始狀態,若是沒有任何問題,永久保存(commit),這樣保證這段內容輸入爲正確的數據 session

事務帶來的問題

事務可以給業務邏輯上必定寫入安全,可是在數據上存在大量的併發風險併發

  • 併發風險一:髒讀
    當其中兩條線程同時對同一個表操做,對方拿到是還沒有保存的髒數據
  • 併發風險二:不可重複讀
    兩個數據同時對一條數據進行操做和查看,通常會在庫存刪減上體現
  • 併發風險三:幻讀
    兩個線程同時對同一個表操做,致使內容預期不符合

事務隔離

爲有效防止事務併發可能性發生,mysql在事務處理上添加了事務隔離
事務隔離狀況以下ui

  • 讀未提交 (read-uncommitted)
  • 讀已提交(read-committed)
  • 可重複讀(reapeatable-read)
  • 串行化(serializable)
select @@tx_isolation --mysql5查詢級別
select @@transaction_isolation; --mysql8查詢級別
set session transaction isolation level XXX
--設置會話級別
複製代碼

總結

有些時候事務可以給予安全的數據寫入,可是也有弊端,因此通常都要善用數據庫的時間處理,好比說服務器惟一支付回調接口才能操做數據,其餘接口只能查看狀態,可是支付接口會影響庫存,呢只能在數據操做上爲不可重複讀,通常須要鎖行atom

相關文章
相關標籤/搜索