最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Spring之路(41)–注意規(guī)避@Transactional聲明式事務(wù)失效的情況

標(biāo)簽:
Spring

注意!

Spring中使用@Transactional的声明式事务是足够简单了,对底层逻辑进行了封装,开发人员拿来即用,方便快捷。

但是一定要注意在某些情况下,声明式事务会失效,事务是如此重要,一旦失效可能会带来灾难性后果,所以本篇我们来实验下。

抛出检查型异常时事务失效

首先了解下一场类型:

  • Exception,受检查的异常,在程序中必须使用try…catch进行处理,遇到这种异常必须进行catch或throw,如果不处理,编译器会报错。例如IOException。
  • RuntimeException:非受检查的异常,可以不使用try…catch进行处理。例如常见的NullPointerException。

在我们的观念中,只要有异常,事务就应该回滚,实际上使用@Transactional时,默认只对非受检查异常回滚。例如:

	@Transactional
	public void addTwoBlog() throws Exception{
		BlogDo blog = new BlogDo();
		blog.setContent("测试");
		blogDao.insert(blog);
		blogDao.insert(blog);
		throw new RuntimeException();//非检查异常,回滚
	}
	@Transactional
	public void addTwoBlog() throws Exception{
		BlogDo blog = new BlogDo();
		blog.setContent("测试");
		blogDao.insert(blog);
		blogDao.insert(blog);
		int a=1/0;//非受检查异常,回滚
	}
	@Transactional
	public void addTwoBlog() throws Exception{
		BlogDo blog = new BlogDo();
		blog.setContent("测试");
		blogDao.insert(blog);
		blogDao.insert(blog);
		throw new Exception();//注意!此处为受检查的异常,报错但不会回滚
	}

OK,那么按正常情况下,我们认为一旦有异常,都应该回滚,此时只需要为注解添加rollbackFor=Exception.class属性即可。
例如:

    @Transactional(rollbackFor=Exception.class)//只要抛出异常就会回滚
	public void addTwoBlog() throws Exception{
		BlogDo blog = new BlogDo();
		blog.setContent("测试");
		blogDao.insert(blog);
		blogDao.insert(blog);
		throw new Exception();
	}

一个事务方法调用另一个事务方法时失效

看如下案例:

	@Transactional
	public void startTransaction() throws Exception{
		this.addTwoBlog();
	}
	
	@Transactional(rollbackFor=Exception.class)
	public void addTwoBlog() throws Exception{
		BlogDo blog = new BlogDo();
		blog.setContent("测试");
		blogDao.insert(blog);
		blogDao.insert(blog);
		throw new Exception();
	}

startTransaction和addTwoBlog方法都是事务方法,且这两个方法事务特性不同(一个没有rollbackFor=Exception.class),如果我们调用startTransaction方法,则addTwoBlog中的事务并不会生效。

也就是说,如果在同一个bean中,一个事务方法调用另一个事务方法,可能会导致被调用的事务方法的事务失效!

这是因为Spring的声明式事务使用了代理,具体机制此处不再探讨,但是一定要规避这种事务失效的场景。我们可以通过将对数据库的操作放到一个bean方法里来解决这个问题。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
軟件工程師
手記
粉絲
1.5萬(wàn)
獲贊與收藏
1524

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消