日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql rr 更新失败_RR 级别下 update 操作的是快照读还是当前读?

發布時間:2024/9/27 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql rr 更新失败_RR 级别下 update 操作的是快照读还是当前读? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們知道在 RR 級別下,重復的 select 操作,讀取的值都會是一致的。即便在兩次 select 操作的中間,有一個事務 B 修改了值,但是在事務 A 中 select 讀取的值還是一致的。

那么如果是 update 操作呢?之前在網上看到一篇博客說 RR 級別下,CAS 操作是沒有意義的。因為 version 值在一個事務中都是一致不變的。于是我有了疑惑打算自己來驗證一下。

驗證想法

RR 級別下 update 操作的是快照讀還是當前讀?

準備數據

準備了以下簡單的表數據結構。

sid

name

sex

version

1

zhangsan

0

0

2

lisi

1

0

驗證思路

通過 version 值做 CAS 版本,修改 sex 值。

A 事務先執行,通過 sleep 5 秒延遲最后的 update 操作。

B 事務后執行,通過 sleep 1 秒使得它雖然事務 id 更大,但比 A 事務更早執行完成。

查看 A 事務通過 version 字段 CAS 操作能否修改成功 sex 值。

如果能修改成功即 update 語句 where 條件定位的是快照讀,反之則定位的是當前讀。

事務腳本

事務 A

事務 A 先執行,事務 id 小

begin;

SELECT version from student where sid = 1;

// 當前獲取的version為0

SELECT SLEEP(5);

SELECT version from student where sid = 1;

// 此時獲取的version依然為0

update student set sex = 1 , version = version +1 where sid = 1 and version = 0;

// 修改行數為0,修改操作失敗,說明version已經不是0了,

commit;

事務 B

事務 B 后執行,事務 id 大

begin;

SELECT version from student where sid = 1;

// 當前獲取的version為0

SELECT SLEEP(1);

SELECT version from student where sid = 1;

// 此時獲取的version依然為0

update student set sex = 2 , version = version +1 where sid = 1 and version = 0;

// 修改成功,此時當前version為1

commit;

驗證結果

事務 A 的 update 操作失敗,說明 update 中的 where 條件定位的記錄是當前讀而非快照讀。

總結

以上是生活随笔為你收集整理的mysql rr 更新失败_RR 级别下 update 操作的是快照读还是当前读?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。