-- 建立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的...