国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個事務(wù)插入,另外一個事務(wù)更新操作,是否會更新成功?

這篇具有很好參考價值的文章主要介紹了一個事務(wù)插入,另外一個事務(wù)更新操作,是否會更新成功?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.前言

同樣另外一個非常有意思的題目,值得我們思考。大概背景是這個樣子的。如果有一個事務(wù)A進(jìn)行插入 id > 100, 同時另外一個事務(wù)B進(jìn)行更新update id > 100。那么事務(wù)B是否會更新成功。我們來畫一個時序圖:

time 事務(wù)A 事務(wù)B 備注
T1 insert id > 100 set status = 1
T2 update id > 100 set status = 2
T3 最后id > 100 status是為1 還是為2呢

2.代碼

我們從事務(wù)的四個隔離性來分別討論這個問題。所有代碼如下,僅僅是隔離性級別修改。修改是status狀態(tài)。
以下所有操作類似于打開兩個瀏覽器,首先請求事務(wù)A,事務(wù)A執(zhí)行過程中,在請求事務(wù)B,觀察結(jié)果。

  1. 事務(wù)A 進(jìn)行插入
@RequestMapping("/test/publish/submit")
public String testPublish1() {
	log.info("start...");
	transactionTemplate.execute(new TransactionCallback<String>() {
		@Override
		public String doInTransaction(TransactionStatus status)  {
			for (long i = 1000; i < 3000; i++) {
				TElement element = new TElement();
				element.setfElementId(i);
				element.setfElementName("111");
				element.setfElementStatus((byte) 1);
				mapper.insertSelective(element);
			}
			return "OK";
		}
	});
	log.info("end...");
	return "ok";
}
  1. 事務(wù)B 進(jìn)行更新
@RequestMapping("/test/publish/submit2")
public String testPublish2() {
	log.info("start...");
	transactionTemplate.execute(new TransactionCallback<String>() {
		@Override
		public String doInTransaction(TransactionStatus status)  {
			// @Update({"UPDATE t_element SET f_element_status=#{status} WHERE f_element_id > #{elementId}"})
			mapper.update(1000L, (byte) 2);
			return "OK";
		}
	});
	log.info("end...");

	return "ok";
}

2.1讀未提交(READ UNCOMMITTED)級別

經(jīng)過以上步驟測試,我們得出了如下日志

[INFO  2023-04-13 11:39:29.941] [http-nio-8099-exec-2] [df9c9572-a906-4f5c-91a2-c1fb4a87adcf] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...]

[INFO  2023-04-13 11:39:31.708] [http-nio-8099-exec-3] [5651390e-f3be-4d35-81dc-cc7bb0062f40] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...]
[INFO  2023-04-13 11:39:31.760] [http-nio-8099-exec-3] [5651390e-f3be-4d35-81dc-cc7bb0062f40] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...]

[INFO  2023-04-13 11:39:42.952] [http-nio-8099-exec-2] [df9c9572-a906-4f5c-91a2-c1fb4a87adcf] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...]

我們可以看到事務(wù)A在29秒開始執(zhí)行,并且在42秒執(zhí)行完成。
事務(wù)B在31秒開始執(zhí)行,并且沒有阻塞,立刻執(zhí)行完成。
我們再來觀察以下數(shù)據(jù)庫中的數(shù)據(jù),我們發(fā)覺status=1,也就是事務(wù)B沒有更新成功
因此在READ UNCOMMITTED下,事務(wù)會有問題。
一個事務(wù)插入,另外一個事務(wù)更新操作,是否會更新成功?

2.2讀已提交(READ COMMITTED)

經(jīng)過以上步驟測試,我們得出了如下日志。我們可以看到在RC級別下,出現(xiàn)了和READ UNCOMMITTED同樣的現(xiàn)象。
具體原因如上,就是沒有加鎖。

[INFO  2023-04-13 11:46:59.684] [http-nio-8099-exec-3] [a11f29f2-0658-42b4-8eba-28b5f94f9037] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...]

[INFO  2023-04-13 11:47:01.029] [http-nio-8099-exec-2] [a9d04f6e-4efe-4ed7-a2df-c2454d8d7946] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...]
[INFO  2023-04-13 11:47:01.090] [http-nio-8099-exec-2] [a9d04f6e-4efe-4ed7-a2df-c2454d8d7946] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...]

[INFO  2023-04-13 11:47:12.574] [http-nio-8099-exec-3] [a11f29f2-0658-42b4-8eba-28b5f94f9037] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...]

2.3可重復(fù)讀(REPEATABLE READ)

經(jīng)過以上步驟測試,我們得出了如下日志。注意以下testPublishUpdate日志和以上日志的不同。

[INFO  2023-04-13 11:50:47.428] [http-nio-8099-exec-3] [83cac49b-f44e-44bd-a8ef-9d60714016f6] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...]
[INFO  2023-04-13 11:50:48.851] [http-nio-8099-exec-2] [f66d62af-aa3f-4d3e-9f66-c97307d6e38e] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...]


[INFO  2023-04-13 11:50:53.872] [http-nio-8099-exec-3] [83cac49b-f44e-44bd-a8ef-9d60714016f6] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...]
[INFO  2023-04-13 11:50:53.895] [http-nio-8099-exec-2] [f66d62af-aa3f-4d3e-9f66-c97307d6e38e] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...]

在事務(wù)A insert的時候,事務(wù)B update的時候阻塞了。這時候其實是間隙鎖發(fā)揮了作用,也就是必須等事務(wù)A執(zhí)行完畢之后,事務(wù)B才會獲取鎖,去update更新。那這時候就會更新成功了。數(shù)據(jù)庫數(shù)據(jù)如下:

一個事務(wù)插入,另外一個事務(wù)更新操作,是否會更新成功?

2.4序列化

隔離級別最嚴(yán)格的級別。同2.3會阻塞然后更新成功。

3.結(jié)論

在隔離級別為 讀未提交(READ UNCOMMITTED)以及讀已提交(READ COMMITTED)情況下,會出現(xiàn)事務(wù)更新失敗的情況。
本質(zhì)上就是沒有加鎖導(dǎo)致的,而在RR級別,給事務(wù)A加上了間隙鎖,事務(wù)B必須等待才能update成功。是用了鎖的的方式來解決的,但可能存在效率的問題。所以鎖盡量細(xì)化,比如行鎖 > 間隙鎖 > 記錄鎖 > 表鎖。都是平衡效率以及安全的一種手段。文章來源地址http://www.zghlxwxcb.cn/news/detail-412324.html

到了這里,關(guān)于一個事務(wù)插入,另外一個事務(wù)更新操作,是否會更新成功?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包