婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > RR與RC隔離級別下索引和鎖的測試腳本示例代碼

RR與RC隔離級別下索引和鎖的測試腳本示例代碼

熱門標簽:高德地圖標注中心個人注冊 湘潭電銷機器人咨詢電話 400電話辦理都選易號網 外呼系統防封號違法嗎 高德地圖標注模式 寶應電信400電話辦理費用 外呼系統服務 如何在高德地圖標注新地址 電銷機器人針對的

基本概念

當前讀與快照讀

在MVCC中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。 快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。當前讀,讀取的是記錄的最新版本,并且對返回的記錄,都會加上鎖,保證在事務結束前,這條數據都是最新版本。

快照讀:簡單的select操作,屬于快照讀,不加鎖(Serializable除外)。

select * from table where ?;

當前讀:特殊的讀操作,插入/更新/刪除操作,屬于當前讀,需要加鎖。 

select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values ();
update table set ? where ?;
delete from table where ?;

隔離級別與加鎖機制

  • Read Uncommitted 會發生臟讀,不考慮。
  • Read Committed (RC) 針對當前讀,RC隔離級別保證對讀取到的記錄加鎖 (Gap Locking),存在幻讀現象。
  • Repeatable Read (RR) 針對當前讀,RR隔離級別保證對讀取到的記錄加鎖 (Record Locking),同時保證對讀取的范圍加鎖,新的滿足查詢條件的記錄不能夠插入 (Gap Locking),不存在幻讀現象。
  • Serializable 所有的讀操作均為退化為當前讀,讀寫沖突,因此并發度急劇下降,不考慮。

測試腳本

-- 基本操作 --
-- 查詢事務隔離級別,默認是RR
show variables like '%isolation%';

-- 設置事務隔離級別為RC
set session transaction isolation level read committed;


-- 數據初始化 --
begin;
drop table if exists user;
CREATE TABLE `user` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `email` varchar(64) NOT NULL,
 `age` int(11) NOT NULL,
 `address` varchar(64) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `uniq_email` (`email`),
 KEY `idx_age` (`age`)
);

insert into user (email, age, address) values ("test1@elsef.com", 18, "address1");
insert into user (email, age, address) values ("test2@elsef.com", 20, "address2");
insert into user (email, age, address) values ("test3@elsef.com", 20, "address3");

commit;
select * from user;



-- 一、trx_id示例
begin;
SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
select * from user;
SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
SHOW ENGINE INNODB STATUS;
update user set age = 22 where id = 3;
-- 查詢事務id
SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
-- INNODB 引擎狀態
SHOW ENGINE INNODB STATUS;
commit;

-- 二、可重復讀、不可重復讀示例

-- session1
set session transaction isolation level read committed;
begin;
-- session2
set session transaction isolation level repeatable read;
begin;
-- session1
select * from user;
-- session2
select * from user;
-- session3
begin;
insert into user (email, age, address) values ("test4@elsef.com", 30, "address4");
commit;
-- session1 這里因為是RC,所以可以讀到trx3提交的新數據,這里如果是證明不可重復讀的話應該使用update而不是insert
select * from user;
commit;
-- session2 這里因為是RR,所以不會讀到trx3提交的新數據
select * from user;
commit;

-- 三、快照讀幻讀示例
-- session1
set session transaction isolation level repeatable read;
begin;
-- 這里使用快照讀
select * from user;
-- session2
begin;
insert into user (email, age, address) values ("test4@elsef.com", 30, "address4");
commit;
select * from user;
-- session1
select * from user; -- 這里讀不到test4@的數據,因為是RR
-- 這里發生了幻讀
insert into user (email, age, address) values ("test4@elsef.com", 30, "address4"); -- 插入失敗因為email唯一索引沖突
commit;

-- 四、當前讀幻讀示例
-- RC
-- session1
set session transaction isolation level read committed;
begin;
-- 這里會對所有滿足條件的age=20的記錄加鎖,因為是RC,所以沒有GAP鎖
delete from user where age = 20;
select * from user;
-- session2
set session transaction isolation level read committed;
begin;
-- 因為trx1沒有加GAP鎖,所以之類可以插入age=20的記錄
insert into user (email, age, address) values ("test4@elsef.com", 20, "address4");
select * from user; -- 可以查到4條數據,可以讀到trx1的刪除數據,因為是RC,trx1未提交所以沒影響trx2
commit;
-- session1
select * from user; -- 可以讀到trx2新插入的數據,雖然trx1是當前讀,但是并未添加相應的next-key鎖,沒有阻止trx2的新數據插入
commit;

--RR
-- session1
set session transaction isolation level repeatable read;
begin;
delete from user where age = 20;
select * from user;
-- session2
begin;
-- 這里會阻塞,因為trx1在age=20周圍加了GAP鎖
-- 非唯一索引,首先,通過索引定位到第一條滿足查詢條件的記錄,加記錄上的X鎖,加GAP上的GAP鎖,然后加主鍵聚簇索引上的記錄X鎖;
-- 然后讀取下一條,重復進行。直至進行到第一條不滿足條件的記錄,此時,不需要加記錄X鎖,但是仍舊需要加GAP鎖,最后返回結束。
insert into user (email, age, address) values ("test4@elsef.com", 20, "address4");
-- 直到超時,ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
-- 此時如果查詢可以看到3條記錄
commit;
-- session1
-- 此時只能看到1條記錄,另外兩條被刪除了
select * from user;
commit;

-- 唯一索引+RC
-- session1
set session transaction isolation level read committed;
begin;
delete from user where email = "test3@elsef.com";
-- session2
begin;
-- 可以讀到,因為trx1是RC
select * from user where email = "test3@elsef.com";
-- 嘗試更新這個記錄的age,會阻塞直到超時,因為email是唯一索引已經被trx1鎖住了,同時也會在對應的主鍵索引上加鎖
-- 注意這里操作的id=3就是trx1中操作的email的同一行記錄
update user set age = 40 where id = 3;
-- session1
commit;
-- session2
commit;

-- 無索引+RC
-- session1
set session transaction isolation level read committed;
begin;
-- 由于address字段無索引,所以Innodb會對所有行進行加鎖,由MySQL server進行判斷并釋放鎖
delete from user where address = "address3";
-- session2
set session transaction isolation level read committed;
begin;
-- 這一行會成功,因為這一行沒有加鎖(先加了后釋放了)
update user set age = 10 where address = "address2";
-- 這一行同樣會被阻塞,原因是它已經被trx1的語句加了鎖了,全部符合條件的都加鎖了
update user set age = 10 where address = "address3";
-- session1
commit;
-- session2
commit;

-- 非唯一索引+RR
-- session1
set session transaction isolation level repeatable read;
begin;
delete from user where age = 20;
-- session2
set session transaction isolation level repeatable read;
begin;
-- 這里會阻塞,因為trx1中已經鎖住了age=20的記錄以及加上了GAP鎖,所以這里18已經落入鎖區間
insert into user (email, age, address) values ("test4@elsef.com", 18, "address4");
-- session1
commit;
-- session2
commit;

-- 無索引RR
-- session1
set session transaction isolation level repeatable read;
begin;
-- 沒有索引,那么會鎖上表中的所有記錄,同時會鎖上主鍵索引上的所有GAP,杜絕所有的并發更新操作
delete from user where address = "address3";
-- session2
set session transaction isolation level repeatable read;
begin;
-- 這里會阻塞,原因是主鍵已經被加上了GAP鎖,所以新的插入不能執行成功
insert into user (email, age, address) values ("test4@elsef.com", 18, "address4");
-- session1
commit;
-- session2
commit;

-- 死鎖 簡單示例
-- session1
begin;
delete from user where id = 1;
-- session2
begin;
delete from user where id = 3;
-- session1
delete from user where id = 3;
-- seession2
-- 這里MySQL判斷發生了死鎖,中斷了一個trx
-- ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
delete from user where id = 1;
-- session1
rollback;
-- session2;
rollback;

-- 五、死鎖 insert示例
drop table if exists t1;
begin;
create table t1 (
 `id` bigint not null auto_increment,
 primary key (`id`)
);
insert into t1 values(1);
insert into t1 values(5);
commit;
select * from t1;
-- session1
begin;
insert into t1 values (2);
-- sessioin2
begin;
-- 這里會阻塞
insert into t1 values (2);
-- session3
begin;
-- 這里會阻塞
insert into t1 values (2);
-- session1;
-- 此時回滾,trx2和trx3收到通知,MySQL自動中斷一個trx,因為發生了死鎖
-- ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
rollback;
--session2;
rollback;
--session3;
rollback;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 深入理解Mysql的四種隔離級別
  • MySQL中Innodb的事務隔離級別和鎖的關系的講解教程
  • MySQL數據庫事務隔離級別介紹(Transaction Isolation Level)
  • 淺析MYSQL REPEATABLE-READ隔離級別
  • MySQL 四種事務隔離級別詳解及對比
  • 深入解析MySQL的事務隔離及其對性能產生的影響
  • MySQL四種事務隔離級別詳解

標簽:宿遷 蘭州 賀州 黃山 黔南 佛山 馬鞍山 南充

巨人網絡通訊聲明:本文標題《RR與RC隔離級別下索引和鎖的測試腳本示例代碼》,本文關鍵詞  與,隔離,級別,下,索引,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《RR與RC隔離級別下索引和鎖的測試腳本示例代碼》相關的同類信息!
  • 本頁收集關于RR與RC隔離級別下索引和鎖的測試腳本示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人高清在线视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 高清在线观看日韩| 亚洲女人****多毛耸耸8| 欧美视频一区二区三区四区| 国产另类ts人妖一区二区| 亚洲图片欧美视频| 国产精品国产自产拍高清av王其| 欧美日韩电影在线| 91色九色蝌蚪| 成人开心网精品视频| 国内久久精品视频| 久久99日本精品| 另类中文字幕网| 亚洲午夜一区二区| 亚洲精品第1页| 国产精品久久久久久久久快鸭 | 久久综合色综合88| 精品国产伦一区二区三区观看方式| 成人app软件下载大全免费| 久久久www成人免费无遮挡大片| 欧美一级黄色片| 欧美日韩午夜在线| 欧美日韩视频在线观看一区二区三区| 亚洲精品自拍动漫在线| 在线免费不卡电影| 日本vs亚洲vs韩国一区三区二区| 中文字幕制服丝袜成人av| 日韩一区二区免费高清| 成人午夜在线免费| 成人av在线影院| 国内精品伊人久久久久av影院 | 国产亚洲欧美激情| 精品国产自在久精品国产| 日韩午夜三级在线| 91猫先生在线| 欧美xxxxx裸体时装秀| 丰满放荡岳乱妇91ww| 一区二区三区免费| 欧美性一区二区| 精品亚洲欧美一区| 亚洲电影第三页| 国产999精品久久久久久绿帽| 国产精品国产三级国产aⅴ入口| 色狠狠色狠狠综合| 97久久精品人人澡人人爽| 在线免费不卡视频| 日韩一级二级三级精品视频| 欧美成人高清电影在线| 中文字幕不卡在线| 亚洲一区在线观看免费观看电影高清| 一区av在线播放| 精品亚洲国内自在自线福利| 午夜精品久久久久久久久久| 人妖欧美一区二区| 国产成人aaaa| 成人精品小蝌蚪| eeuss国产一区二区三区| 色婷婷激情久久| 色婷婷av一区二区| 亚洲精品国产无天堂网2021| 奇米四色…亚洲| 天天免费综合色| 成人综合婷婷国产精品久久蜜臀 | 成人免费黄色在线| 91麻豆精品久久久久蜜臀| 久久久久久9999| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美久久一二三四区| 久久久不卡网国产精品二区| 亚洲国产成人91porn| 亚洲精品成人精品456| 欧美日韩一区在线观看| 一区二区三区精品视频在线| 亚洲乱码中文字幕| 日韩电影在线观看电影| 成人免费视频一区二区| 色婷婷精品久久二区二区蜜臂av | 欧美日韩国产一级片| 国产亚洲精品aa| 五月天网站亚洲| 在线免费观看日本一区| 国产日产精品1区| 五月天国产精品| 在线观看视频一区二区欧美日韩| 国产日韩欧美精品一区| 韩国欧美国产一区| 欧美一区二区三区系列电影| 视频一区在线播放| 欧美日本国产视频| 亚洲国产欧美日韩另类综合| 一本高清dvd不卡在线观看| 夜夜精品视频一区二区| 国产盗摄女厕一区二区三区| www精品美女久久久tv| 麻豆国产一区二区| 欧美一激情一区二区三区| 五月婷婷综合激情| 91啪亚洲精品| 中文字幕一区免费在线观看| 粉嫩一区二区三区在线看| 精品国产91洋老外米糕| 久久9热精品视频| 日韩欧美在线观看一区二区三区| 日韩高清在线电影| 制服丝袜一区二区三区| 日韩综合一区二区| 制服丝袜成人动漫| 青青草成人在线观看| 日韩一级片在线播放| 国产在线一区观看| 中文字幕不卡三区| 99久久国产综合精品女不卡| 亚洲免费在线电影| 欧美色男人天堂| 免费在线视频一区| 欧美精品一区二区在线播放| 国精产品一区一区三区mba视频 | 紧缚捆绑精品一区二区| 26uuu亚洲综合色| youjizz久久| 亚洲一级片在线观看| 亚洲视频电影在线| 成人免费观看av| 亚洲主播在线播放| 欧美日本一区二区| 精品一二三四区| 亚洲色图在线视频| 欧美酷刑日本凌虐凌虐| 国产成人午夜电影网| 亚洲精品一卡二卡| 欧美一区午夜视频在线观看| 成人久久视频在线观看| 亚洲另类在线视频| 欧美一级高清片在线观看| 成人午夜免费av| 亚洲成人你懂的| 国产女主播视频一区二区| 日本久久电影网| 老汉av免费一区二区三区| 久久精品水蜜桃av综合天堂| 风流少妇一区二区| 麻豆传媒一区二区三区| 国产精品久久看| 67194成人在线观看| 成人激情免费网站| 日本vs亚洲vs韩国一区三区二区 | 韩国女主播一区| 樱花草国产18久久久久| 久久色在线视频| 色偷偷久久一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲国产精品激情在线观看| 日韩一区二区免费电影| 色88888久久久久久影院按摩| 精品一区二区免费视频| 亚洲成av人片在线观看无码| 亚洲免费在线观看| 国产精品电影一区二区三区| 久久久精品天堂| 欧美日韩亚洲国产综合| 国产不卡在线播放| 国产精品香蕉一区二区三区| 日本色综合中文字幕| 一区二区三区四区国产精品| 国产精品电影一区二区三区| 亚洲视频免费观看| 97se亚洲国产综合在线| 欧美成人乱码一区二区三区| 色综合久久中文综合久久牛| 国产一区二区三区在线看麻豆| 亚洲风情在线资源站| 亚洲色大成网站www久久九九| 国产欧美va欧美不卡在线| 精品欧美久久久| 日韩三级电影网址| 欧美日韩国产另类一区| 欧美在线你懂的| 欧洲激情一区二区| 精品视频一区 二区 三区| 色吧成人激情小说| 日本韩国欧美在线| 欧美美女一区二区| 欧美精品欧美精品系列| 日韩精品一区二区三区四区 | 久久久久久久久97黄色工厂| 精品久久久久久久人人人人传媒| 欧美一区二区视频网站| 欧美一级xxx| 久久青草国产手机看片福利盒子| 欧美激情在线免费观看| 欧美亚洲国产bt| 麻豆国产精品官网| 日韩有码一区二区三区| 夜夜夜精品看看| 蓝色福利精品导航| 麻豆成人久久精品二区三区小说| 中文字幕在线免费不卡| 日本一区二区成人| 亚洲免费在线播放|