成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于MySQL事務(wù),你必須知道的幾個(gè)知識(shí)點(diǎn)!

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
上期我們講到了jpa的常用操作,查詢(xún)、更新、刪除等,但是如果在操作數(shù)據(jù)庫(kù)事務(wù)時(shí)發(fā)生異常 ,數(shù)據(jù)會(huì)回滾嗎?

 [[408136]]

Transaction事務(wù)

上期我們講到了jpa的常用操作,查詢(xún)、更新、刪除等,但是如果在操作數(shù)據(jù)庫(kù)事務(wù)時(shí)發(fā)生異常 ,數(shù)據(jù)會(huì)回滾嗎?下面我們來(lái)看個(gè)例子

UserController新增如下代碼:

  1. @GetMapping("save1"
  2.  
  3. public String save1(){ 
  4.     User user = new User(); 
  5.     user.setDptId(1L); 
  6.     user.setName("a"); 
  7.     user.setAge(18L); 
  8.     user.setEmail("a@a.com"); 
  9.     user.setHeadImg("headImg1"); 
  10.  
  11.     this.userJpa.save(user); 
  12.     //模擬發(fā)生了異常 
  13.     System.out.println(1/0); 
  14.     return "ok"

使用postman請(qǐng)求

  1. localhost:8080/user/save1 

執(zhí)行之后可以看到j(luò)ava后臺(tái)報(bào)錯(cuò)了,postman前臺(tái)也報(bào)出來(lái)錯(cuò)誤,但是數(shù)據(jù)卻保存進(jìn)去了,數(shù)據(jù)新增了一條記錄

說(shuō)明即使發(fā)生了異常,數(shù)據(jù)還是會(huì)保存進(jìn)去數(shù)據(jù)庫(kù),那應(yīng)該怎么辦呢?試試在save1方法上加一個(gè)@Transactional的注解。

我們?cè)賵?zhí)行一次。發(fā)現(xiàn)錯(cuò)誤也報(bào)出來(lái)了,但是數(shù)據(jù)庫(kù)并沒(méi)有將新數(shù)據(jù)插入進(jìn)去,最新的還是上一次的id為7的記錄,那么 Transactional注解是干嘛的呢?

@Transactional是聲明式事務(wù)管理編程中使用的注解

  1. 該注解是添加在實(shí)現(xiàn)類(lèi)或者 接口 實(shí)現(xiàn)方法上,而不能放在 接口 中
  2. 需要注意的是這個(gè)注解只對(duì)public方法生效

如下是該注解的屬性,我們需要關(guān)注重點(diǎn)關(guān)注的是rollback-for和propagation兩個(gè)屬性。

屬性名 說(shuō)明
name 當(dāng)在配置文件中有多個(gè) TransactionManager , 可以用該屬性指定選擇哪個(gè)事務(wù)管理器。
propagation 事務(wù)的傳播行為,默認(rèn)值為 REQUIRED。
isolation 事務(wù)的隔離度,默認(rèn)值采用 DEFAULT。
timeout 事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1。如果超過(guò)該時(shí)間限制但事務(wù)還沒(méi)有完成,則自動(dòng)回滾事務(wù)。
read-only 指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true。
rollback-for 用于指定能夠觸發(fā)事務(wù)回滾的異常類(lèi)型,如果有多個(gè)異常類(lèi)型需要指定,各類(lèi)型之間可以通過(guò)逗號(hào)分隔。
no-rollback- for 拋出 no-rollback-for 指定的異常類(lèi)型,不回滾事務(wù)。

rollback-for:只有執(zhí)行的異常才回滾。但是我們剛剛的程序并沒(méi)有指定異常,那是默認(rèn)的是遇到什么樣的異常會(huì)回滾呢?

  1. 將UserController中的代碼稍作修改,手動(dòng) throw new Exception("test") ,再執(zhí)行下postman,發(fā)現(xiàn)事務(wù)提交了,并沒(méi)有回滾。
  2. 接著我們將注解修改為 @Transactional(rollbackFor = Exception.class) ,再執(zhí)行postman,事務(wù)卻回滾了,并沒(méi)有提交,什么原因?
  3. spring的 @Transactional 注解可以很方便的開(kāi)啟事務(wù),但是默認(rèn)只在遇到 運(yùn)行時(shí)異常 和 Error 時(shí)才會(huì)回滾,非運(yùn)行時(shí)異常不回滾,即 Exception 的子類(lèi)中,除了 RuntimeException 及其子類(lèi),其他的類(lèi)默認(rèn)不回滾。
  4. 而rollbackFor屬性可以解決這個(gè)問(wèn)題, rollbackFor = Exception.class 表示 Exception 及其子類(lèi)的異常都會(huì)觸發(fā)回滾,同時(shí)不影響 Error 的回滾。

propagation:這個(gè)用得最廣的需求就是業(yè)務(wù)出錯(cuò)了,但是日志必須提交到數(shù)據(jù)庫(kù)。怎么處理?來(lái)看下面的代碼。

新增LogService類(lèi)

  1. @Service 
  2.  
  3. public class LogService { 
  4.     @Resource 
  5.     private UserJpa userJpa; 
  6.  
  7.     @Transactional(propagation = Propagation.REQUIRES_NEW) 
  8.     public void saveLog(){ 
  9.         User user = new User(); 
  10.         user.setDptId(1L); 
  11.         user.setName("log"); 
  12.         user.setAge(18L); 
  13.         user.setEmail("log@log.com"); 
  14.         user.setHeadImg("log"); 
  15.  
  16.         this.userJpa.save(user); 
  17.         System.out.println("log"); 
  18.     } 

新增UserService類(lèi):

  1. @Service 
  2.  
  3. public class UserService { 
  4.     @Resource 
  5.     private UserJpa userJpa; 
  6.     @Resource 
  7.     private LogService logService; 
  8.  
  9.     @Transactional(rollbackFor = Exception.class
  10.     public void saveBiz() throws Exception { 
  11.         System.out.println("save2"); 
  12.         User user = new User(); 
  13.         user.setDptId(1L); 
  14.         user.setName("biz"); 
  15.         user.setAge(18L); 
  16.         user.setEmail("biz@biz.com"); 
  17.         user.setHeadImg("biz"); 
  18.  
  19.         this.userJpa.save(user); 
  20.  
  21.         //模擬保存日志 
  22.         this.logService.saveLog(); 
  23.         //模擬發(fā)生了異常 
  24.         throw new Exception("test1"); 
  25.     } 

UserController新增代碼

  1. @GetMapping("save2"
  2.  
  3. public String save2() throws Exception { 
  4.     //模擬業(yè)務(wù)操作 
  5.     this.userService.saveBiz(); 
  6.     return "ok"

postman執(zhí)行下,是不是只有l(wèi)og的那條記錄插入進(jìn)去了?biz的沒(méi)有插入進(jìn)去。

注意:同一個(gè)業(yè)務(wù)類(lèi)里面 , 即使聲明為 Propagation.REQUIRES_NEW 也不會(huì)新啟一個(gè)事務(wù)。必須調(diào)用另一個(gè)類(lèi)的 Propagation.REQUIRES_NEW 方法才行。所以樣例中是使用 UserService 里面調(diào)用另一個(gè)類(lèi) LogService 中的 saveLog 的方法。

 

責(zé)任編輯:張燕妮 來(lái)源: 博客園
相關(guān)推薦

2020-02-28 14:05:00

Linuxshell命令

2017-12-07 15:47:25

2017-12-07 15:28:36

2017-10-11 15:50:18

光纖通信傳輸

2021-03-01 07:34:42

Java泛型ArrayList

2012-11-05 09:19:37

2019-05-30 08:25:50

5G4G網(wǎng)絡(luò)

2011-12-16 17:05:58

2012-02-08 09:44:05

ChromeAndroid

2010-06-25 09:18:43

MySQLOracle

2019-06-05 15:43:46

固態(tài)硬盤(pán)PC

2011-05-13 11:41:55

2009-06-04 10:20:34

Hibernate持久化Java

2017-10-17 15:18:58

綜合布線網(wǎng)絡(luò)

2009-04-01 11:39:39

視圖DB2

2012-09-29 09:22:24

.NETGC內(nèi)存分配

2012-09-29 10:29:56

.Net內(nèi)存分配繼承

2016-06-29 13:50:12

云計(jì)算

2015-05-29 09:45:42

Google IOA

2015-01-20 11:24:52

Win 10
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩电影一区 | 精品一二三区视频 | 丝袜 亚洲 另类 欧美 综合 | 日韩手机视频 | 视频一区在线 | v片网站 | 一区二区久久精品 | 免费黄色a视频 | 九九热这里只有精品在线观看 | 亚洲一区二区三区免费在线观看 | 视频一区二区中文字幕 | 国产精品毛片一区二区在线看 | 久草视频在线播放 | 男人天堂手机在线视频 | 青青草视频网 | 91在线色视频 | 做a视频| 国产一区 日韩 | 欧美片网站免费 | 99久久久无码国产精品 | 夜夜精品浪潮av一区二区三区 | 成年人网站免费视频 | 亚洲 欧美 在线 一区 | 成人特区 | 亚洲视频一区在线 | 中文字幕在线网 | 米奇7777狠狠狠狠视频 | 久草网在线视频 | 免费黄色在线观看 | 精品乱码一区二区 | 中文字幕免费视频 | 国产高清视频 | 婷婷久久五月 | 国产精品久久久久久一区二区三区 | 三级免费毛片 | 一区视频在线播放 | 精品国产一区二区三区在线观看 | 亚洲天堂免费在线 | 青青久久av北条麻妃海外网 | 精品国产乱码久久久久久闺蜜 | 欧美日韩中文字幕在线 |