自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

 [[408136]]

Transaction事務(wù)

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

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請求

  1. localhost:8080/user/save1 

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

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

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

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

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

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

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

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

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

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

新增LogService類

  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類:

  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的沒有插入進(jìn)去。

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

 

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

2017-12-07 15:47:25

2017-12-07 15:28:36

2020-02-28 14:05:00

Linuxshell命令

2017-10-11 15:50:18

光纖通信傳輸

2021-03-01 07:34:42

Java泛型ArrayList

2019-05-30 08:25:50

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

2012-11-05 09:19:37

2011-12-16 17:05:58

2010-06-25 09:18:43

MySQLOracle

2009-06-04 10:20:34

Hibernate持久化Java

2017-10-17 15:18:58

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

2011-05-13 11:41:55

2012-02-08 09:44:05

ChromeAndroid

2019-06-05 15:43:46

固態(tài)硬盤PC

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)存分配繼承

2021-10-29 08:44:22

推拉機(jī)制面試broker

2016-06-29 13:50:12

云計算

2015-01-20 11:24:52

Win 10
點(diǎn)贊
收藏

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