-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
整形,對(duì)值具有唯一約束條件的數(shù)據(jù)范圍 1~5 ,
已有數(shù)據(jù)1、2、3、4、5,此時(shí)數(shù)據(jù)范圍已被完全填充;
整形,對(duì)值具有唯一約束條件的數(shù)據(jù)范圍 1 和 5 ,
已有數(shù)據(jù)1、5,此時(shí)數(shù)據(jù)范圍已被完全填充;
整形的數(shù)據(jù)范圍 1~5 ,
已有數(shù)據(jù) 1、2、3、4、5,但是因?yàn)闆]有唯一約束,
所以數(shù)據(jù)范圍可以繼續(xù)被 1~5 的數(shù)據(jù)重復(fù)填充;
整形,具有唯一約束條件的數(shù)據(jù)范圍 1~5 ,
已有數(shù)據(jù) 2,5,此時(shí)數(shù)據(jù)范圍未被完全填充,還可以填充 1、3、4 ;
整形的數(shù)據(jù)范圍 1~5 ,數(shù)據(jù)范圍內(nèi)當(dāng)前沒有任何數(shù)據(jù)。
更新丟失:當(dāng)多個(gè)事務(wù)選擇了同一行,然后基于最初選定的值更新該行時(shí),
由于每個(gè)事物不知道其他事務(wù)的存在,最后的更新就會(huì)覆蓋其他事務(wù)所做的更新;
臟讀: 一個(gè)事務(wù)正在對(duì)一條記錄做修改,這個(gè)事務(wù)完成并提交前,這條記錄就處于不一致狀態(tài)。
這時(shí),另外一個(gè)事務(wù)也來(lái)讀取同一條記錄,如果不加控制,
第二個(gè)事務(wù)讀取了這些“臟”數(shù)據(jù),并據(jù)此做了進(jìn)一步的處理,就會(huì)產(chǎn)生提交的數(shù)據(jù)依賴關(guān)系。
這種現(xiàn)象就叫“臟讀”。
不可重復(fù)讀:一個(gè)事務(wù)在讀取某些數(shù)據(jù)后的某個(gè)時(shí)間,再次讀取以前讀過(guò)的數(shù)據(jù),
卻發(fā)現(xiàn)其讀出的數(shù)據(jù)已經(jīng)發(fā)生了改變,或者某些記錄已經(jīng)被刪除了。
這種現(xiàn)象就叫“不可重復(fù)讀”。
幻讀:一個(gè)事務(wù)按相同的查詢條件重新讀取以前檢索過(guò)的數(shù)據(jù),
卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象稱為“幻讀”。
可以簡(jiǎn)單的認(rèn)為滿足條件的數(shù)據(jù)量變化了。
Record Locks
索引記錄鎖,索引記錄鎖始終鎖定索引記錄,即使表中未定義索引,
這種情況下,InnoDB 創(chuàng)建一個(gè)隱藏的聚簇索引,并使用該索引進(jìn)行記錄鎖定。
Gap Locks
間隙鎖是索引記錄之間的間隙上的鎖,或者對(duì)第一條記錄之前或者最后一條記錄之后的鎖。
間隙鎖是性能和并發(fā)之間權(quán)衡的一部分。
對(duì)于無(wú)間隙的數(shù)據(jù)范圍不需要間隙鎖,因?yàn)闆]有間隙。
Next-Key Locks
索引記錄上的記錄鎖和索引記錄之前的 gap lock 的組合。
假設(shè)索引包含 10、11、13 和 20。
可能的next-key locks包括以下間隔,其中圓括號(hào)表示不包含間隔端點(diǎn),方括號(hào)表示包含端點(diǎn):
(負(fù)無(wú)窮大, 10] (10, 11] (11, 13] (13, 20] (20, 正無(wú)窮大) 對(duì)于最后一個(gè)間隔,next-key將會(huì)鎖定索引中最大值的上方,
讀已提交與可重復(fù)讀差別(讀已提交與可重復(fù)讀差別 mysql默認(rèn))
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于讀已提交與可重復(fù)讀差別的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來(lái)看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、mysql默認(rèn)事務(wù)隔離級(jí)別
SQL標(biāo)準(zhǔn)中支持4種事務(wù)隔離級(jí)別,READ_UNCOMMITTED(讀未提交),READ_COMMITTED(讀已提交),REPEATABLE_READ(可重復(fù)讀),SERIALIZABLE(串行讀),MySQL innodb引擎支持全部這4種事務(wù)隔離級(jí)別。
工具/原料:
聯(lián)想Y7000P
Windows10
MySQL6.0
1、啟動(dòng)命令行窗口,連接MySQL數(shù)據(jù)庫(kù)
圖示,通過(guò)MySQL提供的客戶端命令mysql連接MySQL數(shù)據(jù)庫(kù)。
2、通過(guò)系統(tǒng)變量查詢數(shù)據(jù)庫(kù)當(dāng)前事務(wù)隔離級(jí)別
圖示,通過(guò)查詢數(shù)據(jù)庫(kù)提供的系統(tǒng)變量 tx_isolation 或 transaction_isolation 的值即可獲取當(dāng)前的事務(wù)隔離級(jí)別。MySQL數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別是REPEATABLE_READ (可重復(fù)讀)。
3、設(shè)置本次會(huì)話的事務(wù)隔離級(jí)別
圖示,通過(guò)命令set session transaction isolation level可以設(shè)置本次會(huì)話的事務(wù)隔離級(jí)別,該設(shè)置不會(huì)影響其他會(huì)話,并且設(shè)置會(huì)隨著當(dāng)前會(huì)話的結(jié)束而結(jié)束。
4、設(shè)置全局會(huì)話的事務(wù)隔離級(jí)別
圖示,通過(guò)命令set global transaction isolation level可以設(shè)置全局會(huì)話的事務(wù)隔離級(jí)別,該設(shè)置不會(huì)影響當(dāng)前已經(jīng)連接的會(huì)話,設(shè)置完畢后,新打開的會(huì)話,將使用新設(shè)置的事務(wù)隔離級(jí)別。
5、設(shè)置一次操作的事務(wù)隔離級(jí)別
圖示,通過(guò)命令set transaction isolation level可設(shè)置下一次事務(wù)操作的隔離級(jí)別,該設(shè)置會(huì)隨著下一次事務(wù)的提交而失效。
二、深入理解spring
一 IOC容器概述
ioc類型:構(gòu)造注入 屬性注入 接口注入
類裝載步驟:裝載 驗(yàn)證 準(zhǔn)備 解析 初始化 使用 卸載
classLoader:根加載器(bootstrap) 擴(kuò)展加載器(ext) 系統(tǒng)加載器(app) 采用全盤負(fù)責(zé)委托機(jī)制
反射:可以從class對(duì)象獲取構(gòu)造函數(shù) 成員變量 方法三個(gè)主要反射類
資源訪問利器Resource:FileSystemResource ClassPathResource ServletContextResource
BeanFactory ApplicationContext:beanFactory為ioc容器 spring框架的基礎(chǔ)設(shè)施 面向spring,常用XmlBeanFactory ,applicationContext為應(yīng)用上下文,面向開發(fā)者,主要實(shí)現(xiàn)類有classpathXmlApplicationContext fileSystemXmlApplicationContext,區(qū)別:beanFactory 在第一次調(diào)用才初始化,而applicationContext是在容器啟動(dòng)初始化上下文即初始化bean
WebapplicationContext:兩種初始化方法 org.springframework.web.context.ContextLoaderListener和org.springframework.web.context.ContextLoaderServlet
Bean生命周期:獲取bean 初始化 設(shè)置屬性 卸載
二 IOC中裝配Bean
變量前兩個(gè)字母要么全部大寫,要么全部小寫,eg:isBatch IDCard
依賴注入:屬性注入、構(gòu)造注入、工廠方法注入
Bean間關(guān)系:繼承(parent),依賴(depends-on),引用(idref)
Bean的作用域:singleton prototype request session globalSession
基于注解啟動(dòng)spring容器:ApplicationContext ct = new AnnotationConfigApplicationContext(); ct.registe(Config.class); ct.refresh();
三 Spring高級(jí)
Bean創(chuàng)建過(guò)程:
1.ResourceLoader 加載配置文件,生成對(duì)應(yīng)的 Resource
2.BeanDefinitionReader讀取并解析resource,生成對(duì)應(yīng)的 BeanDefinition ,并注冊(cè)到BeanDefinitionRegister中,
3.spring掃描BeanDefinitionRegister讀取BeanDeifnition,如果bean實(shí)現(xiàn)工廠后處理器(BeanFactoryPostProcessor),對(duì)beanDefinition進(jìn)行處理
4.使用InstantiationStrategy初始化Bean,相當(dāng)于new
5.使用BeanWarpper對(duì)bean進(jìn)行封裝,完成bean屬性設(shè)置工作
6.利用容器中注冊(cè)的bean后處理器(實(shí)現(xiàn)BeanPostProcessor接口),對(duì)bean進(jìn)行后續(xù)加工
使用外部文件:使用<context:property-placeholder location=""/> 注file-encoding="utf8",使用${屬性名}引用屬性值
加密外部文件:1.繼承PropertyPlaceholderConfigurer 重寫convertProperty(String propertyName,String propertyValue)方法,2.通過(guò)傳統(tǒng)配置方式引入配置文件 <bean class="" p:location=""/>
國(guó)際化信息
本地化格式工具:DateFormat NumberFormat MessageFormat MessageSource
四 Spring Aop
基礎(chǔ)知識(shí):
jdk動(dòng)態(tài)代理:1.實(shí)現(xiàn)InvocationHandler 在invoke方法定義橫切邏輯,通過(guò)反射調(diào)用目標(biāo)類方法
2.通過(guò)Proxy.newProxyInstance() 為目標(biāo)對(duì)象創(chuàng)建代理
cglib動(dòng)態(tài)代理:采用底層字節(jié)碼技術(shù),為類創(chuàng)建子類,在子類攔截所有調(diào)用父類方法的調(diào)用,性能優(yōu)于jdk代理
1.實(shí)現(xiàn)MethodInteceptor 在inteceptor方法定義橫切邏輯
2.通過(guò)字節(jié)碼創(chuàng)建子類代理類
增強(qiáng)類型:前置 后置 異常 最終 環(huán)繞 引介,引介:為目標(biāo)類創(chuàng)建新的方法或?qū)崿F(xiàn),類級(jí)別
五 基于@AspectJ和Schema的spring aop
注解:
通配符:* 匹配任意字符 只能匹配上下文的一個(gè)元素
.. 匹配任意字符 匹配多個(gè)元素
+ 表示類型匹配的所有類 包括子類
切點(diǎn)函數(shù):@annotation(注解) 表示標(biāo)識(shí)注解的所有方法
@execution(* com.baobaotao.Waiter+.*(..)) 表示匹配Waiter 及子類的所有方法,第一個(gè)*表示返回類型
args() 針對(duì)方法簽名的 入?yún)⒔邮苤付ǖ念?/p>
@args() 入?yún)⒔邮苤付ㄗ⒔?/p>
within() 同execetion()
target(M) 目標(biāo)類匹配M
@AspectJ進(jìn)階:命名切點(diǎn),切點(diǎn)可以作為類似變量定義、引入
連接點(diǎn)對(duì)象,JoinPoint ProceedingJoinPoint(環(huán)繞增強(qiáng))
綁定連接點(diǎn)方法入?yún)ⅲㄟ^(guò)args綁定
綁定代理對(duì)象,通過(guò)this
綁定類注解對(duì)象 通過(guò)within()或 target()
綁定返回值,通過(guò)returning
綁定拋出的異常,通過(guò)throwing
aop方式有四種:@AspectJ <aop:aspect> Advisor <aop:advisor> 下面是對(duì)比
六 Spring對(duì)Dao的支持
DBCP數(shù)據(jù)源:BasicDataSource
initialSize 默認(rèn)0 初始化連接數(shù)
maxActive 8 最大活動(dòng)鏈接
maxIdle 8 最大空閑鏈接
ValidationQuery sql查詢語(yǔ)句 mysql:select 1 oracle : select 1 from dual
testOnBorrow true 是否從池中取出鏈接前檢查
testWhileIdle false 空閑鏈接是否被回收
testBetweenEvictionRunsMillis -1 空閑鏈接回收期運(yùn)行周期
推薦testOnBorrow false,testWhileIdle true testBetweenEvictionRunsMillis一個(gè)合適值
C3P0數(shù)據(jù)源:ComboPooledDataSource
acquireIncrement 鏈接用完時(shí) c3p0一次性創(chuàng)建的數(shù)目
initailPoolSize 初始化創(chuàng)建的數(shù)目
minPoolSize 連接池最小連接數(shù) 反之maxPoolSize
maxIdleTime 0 最大空閑時(shí)間,超時(shí)被丟棄 0為永不丟棄
七 Spring事務(wù)管理
事務(wù)特性:原子性 一致性 隔離性 持久性
讀未提交:會(huì)臟讀 不可重復(fù)讀 幻讀
讀已提交(READ COMMITED):會(huì)不可重復(fù)讀(兩次讀取同一記錄 結(jié)果不一樣) 幻讀
可重復(fù)讀(REPEATALBE READ):會(huì)幻讀(一個(gè)事務(wù) 第一次讀取到10條記錄 第二次讀取11條記錄)
序列化(SERIALIABLE):讀加共享鎖 寫加排它鎖
ThreadLocal 原理:ThreadLocalMap 方法set(T t) get() remove() initialValue()
事務(wù)傳播行為:REQUIRED 如果沒有事務(wù)則新建,有事務(wù)則加入
REQUIRES_NEW 新建事務(wù) 如果當(dāng)前有事務(wù)則將其掛起
SUPPORTS 支持當(dāng)前事務(wù),如果沒事務(wù)則以無(wú)事務(wù)運(yùn)行
NOT_SUPPROTED 以非事務(wù)方式執(zhí)行 如果當(dāng)前有事務(wù)則掛起
NEVER 以非事務(wù)運(yùn)行 如果當(dāng)前有事務(wù) 則拋出異常
NESTED 如果沒有事務(wù),就新建事務(wù),如果有,嵌套當(dāng)前事務(wù)
使用XML配置聲明式事務(wù)
基于注解配置聲明式事務(wù)
三、幻讀和不可重復(fù)讀的區(qū)別
幻讀和不可重復(fù)讀的區(qū)別
1) "不可重復(fù)讀" 是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題
要避免這種情況,通常可以用 set tran isolation level repeatable read 來(lái)設(shè)置隔離級(jí)別,這樣事務(wù)A 在兩次讀取表T中的數(shù)據(jù)時(shí),事務(wù)B如果企圖更改表T中的數(shù)據(jù)(細(xì)節(jié)到事務(wù)A讀取數(shù)據(jù))時(shí),就會(huì)被阻塞,知道事務(wù)A提交! 這樣就保證了,事務(wù)A兩次讀取的數(shù)據(jù)的一致性。
2)幻覺讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。
還是上面的例子,事務(wù)A要兩次讀取表T的中數(shù)據(jù),雖然設(shè)置 repeatable read 可以防止事務(wù)B對(duì)數(shù)據(jù)進(jìn)行修改,但是事務(wù)B卻可以向表T中插入新的數(shù)據(jù)。如何防止這個(gè)問題,我們可以考慮設(shè)置最高的事務(wù)隔離級(jí)別 set tran isolation level serializable。于是乎,事務(wù)B就只能乖乖的等待事務(wù)A的提交,才能想表T中插入新的數(shù)據(jù),從而避免了幻讀!
四、關(guān)于mySql 中樂觀鎖與讀已提交(事務(wù)隔離級(jí)別)的搭配使用問題!!求大神帶飛!
術(shù)式之后皆為邏輯,一切皆為需求和實(shí)現(xiàn)。希望此文能從需求、現(xiàn)狀和解決方式的角度幫大家理解隔離級(jí)別。
隔離級(jí)別的產(chǎn)生
在串型執(zhí)行的條件下,數(shù)據(jù)修改的順序是固定的、可預(yù)期的結(jié)果,但是并發(fā)執(zhí)行的情況下,數(shù)據(jù)的修改是不可預(yù)期的,也不固定,為了實(shí)現(xiàn)數(shù)據(jù)修改在并發(fā)執(zhí)行的情況下得到一個(gè)固定、可預(yù)期的結(jié)果,由此產(chǎn)生了隔離級(jí)別。
所以隔離級(jí)別的作用是用來(lái)平衡數(shù)據(jù)庫(kù)并發(fā)訪問與數(shù)據(jù)一致性的方法。
事務(wù)的4種隔離級(jí)別
READ UNCOMMITTED 未提交讀,可以讀取未提交的數(shù)據(jù)。READ COMMITTED 已提交讀,對(duì)于鎖定讀(select with for update 或者 for share)、update 和 delete 語(yǔ)句, InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。 Gap locking 僅用于外鍵約束檢查和重復(fù)鍵檢查。REPEATABLE READ 可重復(fù)讀,事務(wù)中的一致性讀取讀取的是事務(wù)第一次讀取所建立的快照。SERIALIZABLE 序列化
在了解了 4 種隔離級(jí)別的需求后,在采用鎖控制隔離級(jí)別的基礎(chǔ)上,我們需要了解加鎖的對(duì)象(數(shù)據(jù)本身&間隙),以及了解整個(gè)數(shù)據(jù)范圍的全集組成。
數(shù)據(jù)范圍全集組成
SQL 語(yǔ)句根據(jù)條件判斷不需要掃描的數(shù)據(jù)范圍(不加鎖);
SQL 語(yǔ)句根據(jù)條件掃描到的可能需要加鎖的數(shù)據(jù)范圍;
以單個(gè)數(shù)據(jù)范圍為例,數(shù)據(jù)范圍全集包含:(數(shù)據(jù)范圍不一定是連續(xù)的值,也可能是間隔的值組成)
1. 數(shù)據(jù)已經(jīng)填充了整個(gè)數(shù)據(jù)范圍:(被完全填充的數(shù)據(jù)范圍,不存在數(shù)據(jù)間隙)
2. 數(shù)據(jù)填充了部分?jǐn)?shù)據(jù)范圍:(未被完全填充的數(shù)據(jù)范圍,是存在數(shù)據(jù)間隙)
3. 數(shù)據(jù)范圍內(nèi)沒有任何數(shù)據(jù)(存在間隙)
如下:
在了解了數(shù)據(jù)全集的組成后,我們?cè)賮?lái)看看事務(wù)并發(fā)時(shí),會(huì)帶來(lái)的問題。
無(wú)控制的并發(fā)所帶來(lái)的問題
并發(fā)事務(wù)如果不加以控制的話會(huì)帶來(lái)一些問題,主要包括以下幾種情況。
1. 范圍內(nèi)已有數(shù)據(jù)更改導(dǎo)致的:
2. 范圍內(nèi)數(shù)據(jù)量發(fā)生了變化導(dǎo)致:
因?yàn)闊o(wú)控制的并發(fā)會(huì)帶來(lái)一系列的問題,這些問題會(huì)導(dǎo)致無(wú)法滿足我們所需要的結(jié)果。因此我們需要控制并發(fā),以實(shí)現(xiàn)我們所期望的結(jié)果(隔離級(jí)別)。
MySQL 隔離級(jí)別的實(shí)現(xiàn)
InnoDB 通過(guò)加鎖的策略來(lái)支持這些隔離級(jí)別。
行鎖包含:
左右滑動(dòng)進(jìn)行查看
"上確界"偽記錄的值高于索引中任何實(shí)際值。
上確界不是一個(gè)真正的索引記錄,因此,實(shí)際上,這個(gè) next-key 只鎖定最大索引值之后的間隙。
基于此,當(dāng)獲取的數(shù)據(jù)范圍中,數(shù)據(jù)已填充了所有的數(shù)據(jù)范圍,那么此時(shí)是不存在間隙的,也就不需要 gap lock。
對(duì)于數(shù)據(jù)范圍內(nèi)存在間隙的,需要根據(jù)隔離級(jí)別確認(rèn)是否對(duì)間隙加鎖。
默認(rèn)的 REPEATABLE READ 隔離級(jí)別,為了保證可重復(fù)讀,除了對(duì)數(shù)據(jù)本身加鎖以外,還需要對(duì)數(shù)據(jù)間隙加鎖。
READ COMMITTED 已提交讀,不匹配行的記錄鎖在 MySQL 評(píng)估了 where 條件后釋放。
對(duì)于 update 語(yǔ)句,InnoDB 執(zhí)行 "semi-consistent" 讀取,這樣它會(huì)將最新提交的版本返回到 MySQL,
以便 MySQL 可以確定該行是否與 update 的 where 條件相匹配。
總結(jié)&延展:
唯一索引存在唯一約束,所以變更后的數(shù)據(jù)若違反了唯一約束的原則,則會(huì)失敗。
當(dāng) where 條件使用二級(jí)索引篩選數(shù)據(jù)時(shí),會(huì)對(duì)二級(jí)索引命中的條目和對(duì)應(yīng)的聚簇索引都加鎖;所以其他事務(wù)變更命中加鎖的聚簇索引時(shí),都會(huì)等待鎖。
行鎖的增加是一行一行增加的,所以可能導(dǎo)致并發(fā)情況下死鎖的發(fā)生。
例如,
在 session A 對(duì)符合條件的某聚簇索引加鎖時(shí),可能 session B 已持有該聚簇索引的 Record Locks,而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks。
session A 和 session B 是通過(guò)兩個(gè)不相干的二級(jí)索引定位到的聚簇索引。
session A 通過(guò)索引 idA,session B通過(guò)索引 idB 。
當(dāng) where 條件獲取的數(shù)據(jù)無(wú)間隙時(shí),無(wú)論隔離級(jí)別為 rc 或 rr,都不會(huì)存在間隙鎖。
比如通過(guò)唯一索引獲取到了已完全填充的數(shù)據(jù)范圍,此時(shí)不需要間隙鎖。
間隙鎖的目的在于阻止數(shù)據(jù)插入間隙,所以無(wú)論是通過(guò) insert 或 update 變更導(dǎo)致的間隙內(nèi)數(shù)據(jù)的存在,都會(huì)被阻止。
rc 隔離級(jí)別模式下,查詢和索引掃描將禁用 gap locking,此時(shí) gap locking 僅用于外鍵約束檢查和重復(fù)鍵檢查(主要是唯一性檢查)。
rr 模式下,為了防止幻讀,會(huì)加上 Gap Locks。
事務(wù)中,SQL 開始則加鎖,事務(wù)結(jié)束才釋放鎖。
就鎖類型而言,應(yīng)該有優(yōu)化鎖,鎖升級(jí)等,例如rr模式未使用索引查詢的情況下,是否可以直接升級(jí)為表鎖。
就鎖的應(yīng)用場(chǎng)景而言,在回放場(chǎng)景中,如果確定事務(wù)可并發(fā),則可以考慮不加鎖,加快回放速度。
鎖只是并發(fā)控制的一種粒度,只是一個(gè)很小的部分:
從不同場(chǎng)景下是否需要控制并發(fā),(已知無(wú)交集且有序的數(shù)據(jù)的變更,MySQL 的 MTS 相同前置事務(wù)的多事務(wù)并發(fā)回放)
并發(fā)控制的粒度,(鎖是一種邏輯粒度,可能還存在物理層和其他邏輯粒度或方式)
相同粒度下的優(yōu)化,(鎖本身存在優(yōu)化,如IX、IS類型的優(yōu)化鎖)
粒度加載的安全&性能(如獲取行鎖前,先獲取頁(yè)鎖,頁(yè)鎖在執(zhí)行獲取行鎖操作后即釋放,無(wú)論是否獲取成功)等多個(gè)層次去思考并發(fā)這玩意。
以上就是關(guān)于讀已提交與可重復(fù)讀差別相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
讀已提交與可重復(fù)讀差別(讀已提交與可重復(fù)讀差別 mysql默認(rèn))
手機(jī)插件怎么安裝(手機(jī)插件怎么安裝到電腦上)
視頻號(hào)如何掛商品鏈接(視頻號(hào)短視頻怎么掛商品鏈接)