事務 髒讀 不可重複讀 幻讀

2021-10-17 15:28:52 字數 4350 閱讀 5735

-- 建立db8資料庫

create

database db8;

-- 使用db8資料庫

use db8;

-- 建立賬戶表

create

table account(

id int

primary

keyauto_increment

,-- 賬戶id

name varchar(20

),-- 賬戶名稱

money double

-- 賬戶餘額);

-- 新增資料

insert

into account values

(null

,'張三'

,1000),

(null

,'李四'

,1000

);

-- 張三給李四轉賬500元

-- 開啟事務

start

transaction

;-- 1.張三賬戶-500

update account set money=money-

500where name=

'張三'

; 出錯了...

-- 2.李四賬戶+500

update account set money=money+

500where name=

'李四'

;-- 回滾事務

rollback

;-- 提交事務

commit

;

/*

查詢事務提交方式:select @@autocommit; -- 1代表自動提交 0代表手動提交

修改事務提交方式:set @@autocommit=數字;

*/-- 查詢事務的提交方式

select @@autocommit

;update account set money=

2000

where id=1;

commit

;-- 修改事務的提交方式

set @@autocommit=1

;

/*

查詢隔離級別:select @@tx_isolation;

修改隔離級別:set global transaction isolation level 級別字串;

*/-- 查詢事務隔離級別

select @@tx_isolation

;-- 修改事務隔離級別(修改後需要重新連線)

setglobal

transaction

isolation

level

read

committed

;

/*

髒讀的問題演示和解決

髒讀:乙個事務中讀取到了其他事務未提交的資料

*/-- 設定事務隔離級別為read uncommitted

setglobal

transaction

isolation

level

read

uncommitted

;set

global

transaction

isolation

level

read

committed

;-- 開啟事務

start

transaction

;-- 轉賬

update account set money = money-

500where name=

'張三'

;update account set money = money+

500where name=

'李四'

;-- 查詢account表

select

*from account;

-- 回滾

rollback

;-- 提交事務

commit

;

05_事務_髒讀的問題演示和解決_視窗2

-- 查詢事務隔離級別

select @@tx_isolation

;-- 開啟事務

start

transaction

;-- 查詢account表

select

*from account;

-- 提交事務

commit

;

/*

不可重複讀的問題演示和解決

不可重複讀:乙個事務中讀取到了其他事務已提交的資料

*/-- 設定事務隔離級別為read committed

setglobal

transaction

isolation

level

read

committed

;set

global

transaction

isolation

level

repeatable

read

;-- 開啟事務

start

transaction

;-- 轉賬

update account set money = money-

500where name=

'張三'

;update account set money = money+

500where name=

'李四'

;-- 查詢account表

select

*from account;

-- 提交事務

commit

;

06_事務_不可重複讀的問題演示和解決_視窗2

-- 查詢隔離級別

select @@tx_isolation

;-- 開啟事務

start

transaction

;-- 查詢account表

select

*from account;

-- 提交事務

commit

;

/*

幻讀的問題演示和解決

查詢某記錄是否存在,不存在

準備插入此記錄,但執行插入時發現此記錄已存在,無法插入

或某記錄不存在執行刪除,卻發現刪除成功

*/-- 設定隔離級別為repeatable read

setglobal

transaction

isolation

level

repeatable

read

;set

global

transaction

isolation

level

serializable

;-- 開啟事務

start

transaction

;-- 新增記錄

insert

into account values(3

,'王五'

,2000);

insert

into account values(4

,'趙六'

,3000);

-- 查詢account表

select

*from account;

-- 提交事務

commit

;

07_事務_幻讀的問題演示和解決_視窗2

-- 查詢隔離級別

select @@tx_isolation

;-- 開啟事務

start

transaction

;-- 查詢account表

select

*from account;

-- 新增

insert

into account values(3

,'王五'

,2000);

-- 提交事務

commit

;

髒讀,不可重複讀,幻讀

髒讀,不可重複讀,幻讀是由於資料庫事務的隔離性導致的問題。髒讀 乙個事務讀取到了其它未提交事務操作的記錄。不可重複讀 乙個事務a內,首次查詢到一條相同記錄,然後事務b修改該條記錄並提交,事務a再次執行相同查詢,得到了事務b更新後的結果,事務a兩次相同的查詢,卻得到了不同的結果,這個叫做不可重複讀。是...

髒讀 不可重複讀 幻讀

髒讀 事務a使用了資料,但是還沒來得及提交,事務b就使用了這個資料,對於事務b來說就是髒讀。允許髒讀 sql server select from category with nolock 不可重複讀 事務a在9點和12點都會操作乙份資料,但是在10點的時候,事務b也操作了該份資料,並且使其數值進行...

髒讀 不可重複讀 幻讀

總結 對於不可重複讀和幻讀的區別是 不可重複讀圈了一塊地,這塊地不允許任何人動用,但是不管旁邊的地方是否開闢了一塊地。幻讀是不僅是圈的地,而且附近也不允許有新的地。這個對於區間查詢會有影響。所以不可重複讀和幻讀最大的區別是區間查詢的結果會不會一樣。幻讀保證結果一樣,但是不可重複讀不保證。mysql的...