mysql的事務以及隔離級別

2021-10-03 18:07:45 字數 3940 閱讀 9769

實際專案中的事務

題外話事務是最小的不可分割的工作單元,事務能保證乙個業務的完整性

執行乙個事務時,事務中只要有乙個操作失敗,整個事務就會失敗

銀行轉賬系統,先扣費再轉賬,如果扣費成功了,但是轉賬失敗了,假如扣費是乙個事務,轉賬為乙個事務,就會導致程式扣費成功了,但是沒有轉賬成功,這樣會造成要取錢的李明(客戶)發現資產不翼而飛了。所以我們應該把扣錢和轉賬看成乙個事務來處理。當成乙個事務的話,事務中其中一步失敗了會導致整個事務失敗。

-- 扣費操作

update

user

set money=money-

100where name=

'張華'

;-- 轉賬操作

update

user

set monry=monry+

100where name=

'李明'

;

autocommit

mysql 預設是有事務的,autocommit=1 表示自動提交,我們來檢視一下 mysql 預設提交事務與否

select @@autocommit;

mysql 設定預設事務不自動提交如下

set autocommit=0;

只有設定為不自動提交的時候,可以用 rollback 回滾

rollback;

不設定為預設提交,可以通過 commit 來提交資料

commit;

begin

使用begin;開啟事務,如下語句一起去執行之後,是把下面看成乙個事務,並且可以通過 roolback 回滾,實際中這種比較常用

begin

;update

user

set money=money-

100where name=

'張華'

;update

user

set monry=monry+

100where name=

'李明'

;

start transaction

使用start transaction;下面語句一起去執行後也一樣起到事務的效果,rollback 一塊回滾,實際中這種比較常用

start

transaction

;update

user

set money=money-

100where name=

'張華'

;update

user

set monry=monry+

100where name=

'李明'

;

我們最後一旦 commit 了事務就無法回滾了

查詢事務隔離級別,設定全域性後當前事務會話級不會影響,設定會話級後全域性事務不會影響

-- 全域性事務查詢

select @@global.tx_isolation

;-- 會話級事務查詢

select @@tx_isolation

;select @@session.tx_isolation

;

修改事務隔離級別,下面以讀提交舉例,其他的隔離級別設定在下面標題內容中有寫

-- 設定全域性的事物隔離級別為讀提交

setglobal

transaction

isolation

level

read

uncommitted

;-- 設定會話級

setsession

transaction

isolation

level

read

uncommitted

;

檢視資料庫事務的隔離級別

-- mysql5.6

-- 系統級別

select @@global.tx_isolation

;-- 會話級別

select @@tx_isolation

;-- mysql8.0

-- 系統級別

select @@global.transaction_isolation

;-- 事務級別

select @@transaction_isolation

;

mysql 事務的預設隔離級別為pepeatable read(重複讀,可能產生幻讀的問題)

併發事務提交前可讀,且可寫

此隔離級別表示允許乙個事務允許讀到另乙個事務未提交的資料

髒讀,兩邊事務開啟,乙個事務中讀到了另乙個事務未提交的資料,實際開發中是不允許髒讀出現的!

修改 mysql8.0 的隔離級別為 read uncommitted

set

global

transaction

isolation

level

read

uncommitted

;

併發事務提交後可讀,且可寫

此隔離級別表示允許乙個事務允許讀到另乙個事務已提交的資料

對於讀未提交的隔離級別是在提交前就能讀取資料, 那現在讀提交的隔離級設定成了提交後另乙個事務才可讀,但是這樣會產生不可重複讀的問題,比如乙個事務中兩次讀取,但是兩次讀之間其他事務操作同樣的資料並提交,這樣第乙個事務兩次讀的資料不一致,操作就會出現問題

修改 mysql8.0 的隔離級別為 read committed

set

global

transaction

isolation

level

read

committed

;

併發事務可寫不可讀

此隔離級別表示允許乙個事務不會讀到另一邊的事物提交的資料,但是這邊事務在運算元據庫時候可能會產生衝突的異常

既然讀提交會導致乙個事務中兩次讀取資料不一致,那我們這樣,在第乙個事務中讀取不到第二個事務提交的資料,這樣第乙個事務兩次讀取都是一樣的,但是會產生幻讀,就是第二次讀取到的資料雖然是某個值,但是實際它已經改變了,這就是幻讀

修改 mysql8.0 的隔離級別為 repeatable read,這個也是 mysql 預設的事物隔離級別

set

global

transaction

isolation

level

repeatable

read

;

併發事務不可讀不可寫

序列化,當表被乙個事務操作的時候(提交之前),其他事務在裡頭的操作是不可進行的,會進入排隊狀態。序列化會出現乙個問題就是效能很差

修改 mysql8.0 的隔離級別為 serializable

set

global

transaction

isolation

level

serializable

;

效能比較

read uncommitted(髒讀) 好於 read committed(不可重複讀) 好於 repeatable read(幻讀) 好於 serializable(序列化)

一般資料庫會採用讀提交作為預設的事物隔離級別,比如 oracle,sql server,但是 mysql 的隔離級別卻是重複讀,

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

事務的介紹以及事務隔離級別

在資料庫操作中,一項事務 transaction 是由一條或多條運算元據庫的sql語句組成的乙個不可分割的工作單元。當事務中的所有操作都正常完成時,整個事務才能被提交到資料庫中,如果有一項操作沒有完成,則整個事務會被回滾。其實事務總結起來理解為 邏輯上的一組操作,組成這組操作的各個單元,要麼一起成功...