最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring事務(wù)里面開(kāi)啟線程插入報(bào)錯(cuò)了是否會(huì)回滾

 更新時(shí)間:2023年04月13日 09:02:44   投稿:mrr  
這篇文章主要介紹了spring事務(wù)里面開(kāi)啟線程插入,報(bào)錯(cuò)了是否會(huì)回滾?這是小編遇到一道面試題,題目大概是這個(gè)樣子,今天抽空通過(guò)示例代碼給大家分析下,需要的朋友可以參考下

1.前言

一道非常有意思的面試題目。大概是這樣子的,如果在一個(gè)事務(wù)中,開(kāi)啟線程進(jìn)行插入更新等操作,如果報(bào)錯(cuò)了,事務(wù)是否會(huì)進(jìn)行回滾。

2.代碼

示例1

@RequestMapping("/test/publish/submit")
public String testPublish1() {

	log.info("start...");
	transactionTemplate.execute(new TransactionCallback<String>() {
		@Override
		public String doInTransaction(TransactionStatus status)  {

			TElement element = new TElement();
			element.setfElementId(10L);
			element.setfElementName("111");
			mapper.insertSelective(element);


			element = new TElement();
			element.setfElementId(10L);
			element.setfElementName("222");
			mapper.insertSelective(element);

			return "OK";
		}
	});
	log.info("end...");

	return "ok";
}

示例2

@RequestMapping("/test/publish/submit2")
public String testPublish2() {

	log.info("start...");
	transactionTemplate.execute(new TransactionCallback<String>() {
		@Override
		public String doInTransaction(TransactionStatus status)  {
			es.submit(() -> {
				TElement element = new TElement();
				element.setfElementId(10L);
				element.setfElementName("111");
				mapper.insertSelective(element);
			});

			es.submit(() -> {
				TElement element = new TElement();
				element.setfElementId(10L);
				element.setfElementName("222");
				mapper.insertSelective(element);
			});

			return "OK";
		}
	});
	log.info("end...");

	return "ok";
}

3.結(jié)論

示例1

element.setfElementId(10L); 為主鍵。SQL在第一次插入id=10的時(shí)候是沒(méi)有問(wèn)題的,在第二次插入id=10的時(shí)候,由于主鍵沖突了,導(dǎo)致報(bào)錯(cuò),然后整個(gè)事務(wù)都會(huì)進(jìn)行回滾,這是沒(méi)有問(wèn)題的。是spring的事務(wù)幫助我們來(lái)進(jìn)行回滾等操作的。我們可以看到如下代碼,他是對(duì)整個(gè)result = action.doInTransaction(status);進(jìn)行了try catch。如果拋異常,就會(huì)回滾

@Override
@Nullable
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
	Assert.state(this.transactionManager != null, "No PlatformTransactionManager set");

	if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
		return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
	}
	else {
		TransactionStatus status = this.transactionManager.getTransaction(this);
		T result;
		try {
			result = action.doInTransaction(status);
		}
		catch (RuntimeException | Error ex) {
			// Transactional code threw application exception -> rollback
			rollbackOnException(status, ex);
			throw ex;
		}
		catch (Throwable ex) {
			// Transactional code threw unexpected exception -> rollback
			rollbackOnException(status, ex);
			throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
		}
		this.transactionManager.commit(status);
		return result;
	}
}

示例2

示例2首先是transactionTemplate.execute是一個(gè)主main線程。然后在第一個(gè)子線程插入了一個(gè)數(shù)據(jù),第二個(gè)子線程也插入了一個(gè)數(shù)據(jù)。那么現(xiàn)在就是有三個(gè)線程,一個(gè)是main線程,一個(gè)是A線程,一個(gè)是B線程。
main線程正常執(zhí)行不報(bào)錯(cuò),A線程正常插入不報(bào)錯(cuò),B線程由于主鍵沖突報(bào)錯(cuò)。
我們可以通過(guò)上面action.doInTransaction(status);看出來(lái),他對(duì)這塊代碼進(jìn)行了try catch。也就是主線程進(jìn)行了try catch。那么也就是只要主線程沒(méi)有報(bào)錯(cuò),這個(gè)事務(wù)就不會(huì)被捕獲,也就不會(huì)回滾了。無(wú)論你A,B還是CDEFG子線程出問(wèn)題了,只要不影響main線程,那事務(wù)就不會(huì)回滾呢?
因此我們可以得出一個(gè)結(jié)論,在示例2中,A線程會(huì)插入成功,B線程插入失敗,事務(wù)不會(huì)回滾,最終插入成功。這個(gè)其實(shí)與我們平常的想法所違背了。
因此如果想要主線程拋出異常,得讓主線程感知到子線程異常了,主動(dòng)地去throw異常。比如我們可以設(shè)置一個(gè)flag,子線程報(bào)錯(cuò)了 flag=true。主線程檢測(cè)到flag為true,就主動(dòng)拋出一個(gè)exception

4.最后

這道面試題非常有意思,起初以為會(huì)回滾,沒(méi)想到不會(huì)回滾。查看代碼得知,原來(lái)是catch住的是主線程,并不是子線程。同樣注解式事務(wù)類似。因此如果想要事務(wù)生效,盡量避免在事務(wù)中使用多線程來(lái)進(jìn)行插入更新等操作

到此這篇關(guān)于spring事務(wù)里面開(kāi)啟線程插入,報(bào)錯(cuò)了是否會(huì)回滾?的文章就介紹到這了,更多相關(guān)spring事務(wù)開(kāi)啟線程插入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    大家項(xiàng)目中如果有生成隨機(jī)數(shù)的需求,我想大多都會(huì)選擇使用Random來(lái)實(shí)現(xiàn),它內(nèi)部使用了CAS來(lái)實(shí)現(xiàn)。?實(shí)際上,JDK1.7之后,提供了另外一個(gè)生成隨機(jī)數(shù)的類ThreadLocalRandom,那么他們二者之間的性能是怎么樣的呢?本文就來(lái)詳細(xì)說(shuō)說(shuō)
    2022-12-12
  • Java設(shè)計(jì)模式之適配器模式詳解

    Java設(shè)計(jì)模式之適配器模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之適配器模式詳解,適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,Adapter模式使得原本由于接口不兼容而不能一起工作的哪些類可以一起工作,需要的朋友可以參考下
    2023-09-09
  • SpringMVC上傳文件的兩種方法

    SpringMVC上傳文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC上傳文件的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringMVC攔截器零基礎(chǔ)掌握

    SpringMVC攔截器零基礎(chǔ)掌握

    攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2023-03-03
  • Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Hutool是一個(gè)Java基礎(chǔ)工具類,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • java如何反編譯jar包并修改class文件重新打包

    java如何反編譯jar包并修改class文件重新打包

    這篇文章主要介紹了java如何反編譯jar包并修改class文件重新打包,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java8 CompletableFuture異步編程解讀

    Java8 CompletableFuture異步編程解讀

    Java8引入的CompletableFuture是Java異步編程的重要進(jìn)展,提供了基于未來(lái)結(jié)果的異步編程模型,它適用于異步計(jì)算、多個(gè)并行任務(wù)組合、異步回調(diào)、超時(shí)控制、錯(cuò)誤處理和多任務(wù)組合與合成等場(chǎng)景
    2024-12-12
  • SpringBoot封裝響應(yīng)處理超詳細(xì)講解

    SpringBoot封裝響應(yīng)處理超詳細(xì)講解

    這篇文章主要介紹了SpringBoot封裝響應(yīng)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • Java中內(nèi)部類的概念與分類詳解

    Java中內(nèi)部類的概念與分類詳解

    一個(gè)類的定義放在另一個(gè)類的內(nèi)部,這個(gè)類就叫做內(nèi)部類,下面這篇文章主要給大家介紹了關(guān)于Java中內(nèi)部類的概念與分類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • JAVA中SpringBoot啟動(dòng)流程分析

    JAVA中SpringBoot啟動(dòng)流程分析

    這篇文章主要介紹了JAVA中SpringBoot啟動(dòng)流程分析的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

喜德县| 郁南县| 大厂| 永修县| 惠东县| 乌恰县| 龙泉市| 无锡市| 新民市| 南涧| 巍山| 陆丰市| 永州市| 丽水市| 泸水县| 江津市| 铜陵市| 锡林郭勒盟| 象山县| 旬阳县| 淮阳县| 山西省| 廉江市| 河北区| 衡山县| 霍州市| 五华县| 易门县| 盖州市| 高要市| 玉溪市| 玛沁县| 新巴尔虎右旗| 进贤县| 安龙县| 葫芦岛市| 那曲县| 新营市| 昌黎县| 嫩江县| 松原市|