日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Springboot編程式事務使用方式詳解

環(huán)境:springboot2.3.9.RELEASE

懷柔網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,懷柔網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為懷柔上1000家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設要多少錢,請找那個售后服務好的懷柔做網(wǎng)站的公司定做!

Spring提供兩種編程式事務管理方法:

  1. 使用TransactionTemplate 或 TransactionalOperator
  2. 直接創(chuàng)建TransactionManager的實現(xiàn)

Spring官方推薦使用TransactionTemplate方式

準備

 
 
 
  1. // 實體類 
  2. @Entity 
  3. @Table(name = "BC_USERS") 
  4. @Data 
  5. public class Users{ 
  6.     private String username ; 
  7.     private String password ; 
  8.     private Integer status = 0 ; 
  9. // DAO 
  10. public interface UsersRepository extends JpaRepository { 
  11.  
  12.   @Modifying 
  13.   @Query("update Users u set u.status=?1,u.password='123123' where u.id=?2") 
  14.   int updateUsers(Integer status, String id) ; 
  15.      
  16. @Mapper 
  17. public interface UsersMapper { 
  18.  
  19.   int insertUser(Users user) ; 
  20.      
  21. // Mapper.xml 
  22.  
  23.   insert into bc_users (id, username, password) values (#{id}, #{username}, #{password}) 
  24.  

1 TransactionTemplate

1.1 有返回值的

 
 
 
  1. @Service 
  2. public class UserService { 
  3.      
  4.   @Resource 
  5.   private TransactionTemplate transactionTemplate ; 
  6.   @Resource 
  7.   private UsersRepository usersRepository ; 
  8.      
  9.   public Integer saveUsers(Users users) { 
  10.     this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
  11.     Integer result = transactionTemplate.execute(new TransactionCallback() { 
  12.       @Override 
  13.       public Integer doInTransaction(TransactionStatus status) { 
  14.         return usersMapper.insertUser(users) ; 
  15.       } 
  16.     }) ; 
  17.     return result ; 
  18.     } 
  19.      

1.2 無返回值的

當沒有返回值時可以使用

TransactionCallbackWithoutResult

 
 
 
  1. public void saveUsers(Users users) { 
  2.   transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
  3.     @Override 
  4.     protected void doInTransactionWithoutResult(TransactionStatus status) { 
  5.       usersMapper.insertUser(users) ; 
  6.     } 
  7.   }) ; 

1.3 事務回滾

事務的回滾通過

TransactionStatus.setRollbackOnly方法

 
 
 
  1. public Users saveUser(Users users) { 
  2.   return transactionTemplate.execute(new TransactionCallback() { 
  3.     @Override 
  4.     public Users doInTransaction(TransactionStatus status) { 
  5.       try { 
  6.         return usersMapper.insertUser(users) ; 
  7.       } catch (Exception e) { 
  8.         status.setRollbackOnly() ; 
  9.       } 
  10.       return null ; 
  11.     } 
  12.   }) ; 

1.4 配置事務屬性

在實例化TransactionTemplate對象的時候我們可以對事務進行相關(guān)的屬性配置,通過如下方式。

 
 
 
  1. private TransactionTemplate transactionTemplate ; 
  2.      
  3. public UserService(PlatformTransactionManager transactionManager) { 
  4.   this.transactionTemplate = new TransactionTemplate(transactionManager) ; 
  5.   this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); 
  6.   this.transactionTemplate.setTimeout(30); //seconds 

測試代碼

 
 
 
  1. public Integer updateUsers(Integer statusValue, String id) { 
  2.   return transactionTemplate.execute(new TransactionCallback() { 
  3.     @Override 
  4.     public Integer doInTransaction(TransactionStatus status) { 
  5.       return usersRepository.updateUsers(statusValue, id) ; 
  6.     } 
  7.   }) ; 
  8. @Modifying 
  9. @Query("update Users u set u.status=?1 where u.id=?2") 
  10. int updateUsers(Integer status, String id) ; 

由于這里事務傳播屬性設置的NOT_SUPPORTED.所以程序會報錯誤

 
 
 
  1. org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query 
  2.     at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:403) 
  3.     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257) 
  4.     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:531) 

2 TransactionalOperator

TransactionalOperator適用于反應式編程,這里不做介紹。

3 TransactionManager

使用TransactionManager管理事務也有兩種

PlatformTransactionManager,

ReactiveTransactionManager

ReactiveTransactionManager適用于反應式編程,這里不做介紹。

3.1 PlatformTransactionManager

在程序中可以使用

PlatformTransactionManager來控制事務的提交與回滾

示例:

 
 
 
  1. private PlatformTransactionManager transactionManager ; 
  2. private DefaultTransactionDefinition definition ; 
  3. private TransactionStatus status ; 
  4. @Resource 
  5. private UsersRepository usersRepository ; 
  6.  
  7. public UserService3(PlatformTransactionManager transactionManager) { 
  8.   this.transactionManager = transactionManager ; 
  9.   definition = new DefaultTransactionDefinition() ; 
  10.   definition.setName("pgName") ; 
  11.   definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED) ; 
  12.      
  13. public Integer saveUsers(Users users) { 
  14.   TransactionStatus status = this.transactionManager.getTransaction(definition) ; 
  15.   Integer result = null ; 
  16.   try { 
  17.     result = usersMapper.insertUser(users) ; 
  18.   } catch (Exception e) { 
  19.     transactionManager.rollback(status) ; 
  20.     throw e ; 
  21.   } 
  22.   transactionManager.commit(status) ; 
  23.   publisher.publishEvent(new UsersEvent(users)); 
  24.   return result ;        

4 事務事件監(jiān)聽

通過@

TransactionalEventListener注解監(jiān)聽事務的不同階段的事件信息

 
 
 
  1. public @interface TransactionalEventListener { 
  2.   TransactionPhase phase() default TransactionPhase.AFTER_COMMIT; 
  3.   boolean fallbackExecution() default false; 
  4.   @AliasFor(annotation = EventListener.class, attribute = "classes") 
  5.   Class[] value() default {}; 
  6.   @AliasFor(annotation = EventListener.class, attribute = "classes") 
  7.   Class[] classes() default {}; 
  8.   String condition() default ""; 

fallbackExecution: 默認值false;如果設置為true,當前即便沒有事務也會觸發(fā)事件。

TransactionPhase:默認值是事務提交以后;有如下幾個取值:

 
 
 
  1. public enum TransactionPhase { 
  2.   BEFORE_COMMIT, // 事務提交前觸發(fā) 
  3.   AFTER_COMMIT, // 事務提交后觸發(fā) 
  4.   AFTER_ROLLBACK, // 事務回滾觸發(fā) 
  5.   AFTER_COMPLETION // 事務完成后 觸發(fā) 

注意:@

TransactionalEventListener注解只對聲明式事務起作用,對編程式事務無效。僅適用于由PlatformTransactionManager管理的線程綁定事務

示例:

 
 
 
  1. // 事件監(jiān)聽 
  2. @Component 
  3. public class TxListenerComponent { 
  4.   @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 
  5.   public void handleUsersAfterCommit(UsersEvent usersEvent) { 
  6.     Users user = (Users) usersEvent.getSource() ; 
  7.     System.out.println("AfterCommit收到事件通知:" + user.getPassword()) ; 
  8.   } 
  9.   @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION) 
  10.   public void handleUsersAfterCompletion(UsersEvent usersEvent) { 
  11.     Users user = (Users) usersEvent.getSource() ; 
  12.     System.out.println("AfterCompletion收到事件通知:" + user.getPassword()) ; 
  13.   } 
  14.  
  15.   @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK) 
  16.   public void handleUsersAfterRollback(UsersEvent usersEvent) { 
  17.     Users user = (Users) usersEvent.getSource() ; 
  18.     System.out.println("AfterRollback收到事件通知:" + user.getPassword()) ; 
  19.   } 
  20.  
  21.   @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) 
  22.   public void handleUsersBeforeCommit(UsersEvent usersEvent) { 
  23.     Users user = (Users) usersEvent.getSource() ; 
  24.     System.out.println("BeforeCommit收到事件通知:" + user.getPassword()) ; 
  25.   } 
  26. // 發(fā)布事件 
  27. @Resource 
  28. private ApplicationEventPublisher publisher ; 
  29. @Resource 
  30. private UsersMapper usersMapper ; 
  31.  
  32. public Integer saveUsers(Users users) { 
  33.   Integer result = transactionTemplate.execute(new TransactionCallback() { 
  34.     @Override 
  35.     public Integer doInTransaction(TransactionStatus status) { 
  36.       return usersMapper.insertUser(users) ; 
  37.     } 
  38.   }) ; 
  39.   publisher.publishEvent(new UsersEvent(users)); 
  40.   return result ; 

運行結(jié)果:

 
 
 
  1. 2021-06-17 14:02:56.830 DEBUG 10000 --- [nio-8081-exec-1] com.pack.mapper.UsersMapper.insertUser   : ==>  Preparing: insert into bc_users (id, username, password) values (?, ?, ?) 
  2. 2021-06-17 14:02:56.840 DEBUG 10000 --- [nio-8081-exec-1] com.pack.mapper.UsersMapper.insertUser   : ==> Parameters: mmmmm(String), mmmmm(String), mmmmm(String) 
  3. 2021-06-17 14:02:56.842 DEBUG 10000 --- [nio-8081-exec-1] com.pack.mapper.UsersMapper.insertUser   : <==    Updates: 1 
  4. BeforeCommit收到事件通知:mmmmm 
  5. AfterCommit收到事件通知:mmmmm 
  6. AfterCompletion收到事件通知:mmmmm 

總結(jié):編程式的事務適合少量的事務操作;比如在一個服務的調(diào)用中有大量的計算操作,最后將計算結(jié)果進行事務的操作這種情況就適合應用事務編程式的進行事務控制。如果一個操作有很多的事務的操作那聲明式的事務方式就更加的合適。


網(wǎng)站欄目:Springboot編程式事務使用方式詳解
轉(zhuǎn)載源于:http://www.5511xx.com/article/cohoiii.html