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

SpringBoot注解@Transactional詳解以及事務失效

數據庫 MySQL
如果要保證原子性,就需要在發生異常時,對已經執行的操作進行回滾,在MySQL中,恢復機制是通過回滾日志實現的,所有事務進行的修改,都會先記錄到這個回滾日志中,然后再執行相關的操作。

一、事務的特點ACID

  • 原子性(Atomicity):事務最小的執行單位,不允許分割,事務的原子性確保動作要么全部完成,要么完全失敗。
  • 一致性(Consistency):執行事務前后,數據保持一致,例如在上面的轉賬例子中,無論事務是否成功,轉賬者和收款人的總額應該是不變的。
  • 隔離性(Isolation):并發訪問數據庫時,一個用戶的事務不被其它事務干擾,各并發事務之間的數據庫是獨立的。
  • 持久性(Durability):一個事務被提交后,它對數據庫中數據的改變是持久的,即使數據庫發生故障也不應該對其有任何影響。

二、Spring對事務的支持

程序是否支持事務的先決條件是數據庫,比如使用MySQL的話,如果選擇的是innodb,那么支持事務,如果選擇的是myisam,那么從根上就不支持事務了

MySQL怎么保證原子性?

如果要保證原子性,就需要在發生異常時,對已經執行的操作進行回滾,在MySQL中,恢復機制是通過回滾日志實現的,所有事務進行的修改,都會先記錄到這個回滾日志中,然后再執行相關的操作。

如果在執行過程中遇到異常,我們直接利用回滾日志中的信息將數據回滾到修改之前的樣子即可,并且回滾日志會先將數據持久化到磁盤上,這樣就可以保證即便在遇到數據庫突然宕機,當用戶再次重啟數據庫時,數據庫還是能夠通過查回滾日志來回滾之前未完成的事務。

三、Spring支持兩種事務管理

3.1編程事務管理

通過TransactionTemplate或者TransactionManager手動管理事務,在實際應用中卻很少使用,下面通過代碼來演示,使用TransactionTemplate進行編程式事務管理

@Autowired
private TransactionTemplate transactionTemplate;

public void testTransactionTemplate() {
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(final TransactionStatus transactionStatus) {
      try {
        //TODO 業務代碼
      } catch (final Exception e) {
        // 異常時回滾
        transactionStatus.setRollbackOnly();
      }
    }
  });
}

使用TransactionManager進行編程式事務管理

@Resource
private PlatformTransactionManager transactionManager;

public void testTransactionManager() {
  final TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
  try {
    //TODO 業務代碼
    transactionManager.commit(status);
  } catch (final Exception e) {
    // 異常時回滾
    transactionManager.rollback(status);
  }
}

3.2聲明式事務管理

聲明式事務管理,實際上是通過AOP實現,基于@Transactional的注解使用最多

@Transactional
public void testTransactional() {
  userInfoDao.save(userInfo);
  userInfoDetailDao.save(userInfoDetail);
}

在實際的業務開發中,大家一般使用@Transactional注解來開啟事務,但很多人并不是很清楚這個注解中的參數是什么意思?有什么用?

3.2.1@Transactional的作用范圍

  • 方法推薦將注解用于方法上,不過需要注意的是:該注解只能應用到 public 方法上,否則不生效。
  • :如果將注解用在類上,表明該類中所有的 public 方法都生效。
  • 接口:不推薦在接口上使用。

@Transactional注解源碼如下,里面包含了基本事務屬性的配置:

package org.springframework.transaction.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
  String value() default "";

  Propagation propagation() default Propagation.REQUIRED;

  Isolation isolation() default Isolation.DEFAULT;

  int timeout() default -1;

  boolean readOnly() default false;

  Class<? extends Throwable>[] rollbackFor() default {};

  String[] rollbackForClassName() default {};

  Class<? extends Throwable>[] noRollbackFor() default {};

  String[] noRollbackForClassName() default {};
}

@Transactional 的常用參數介紹

屬性名

說明

propagation

事務的傳播行為,默認值為 REQUIRED

isolation

事務的隔離級別,默認值采用 DEFAULT

timeout

事務的超時時間,默認值為-1(不會超時),如果超過該時間限制但事務還沒有完成,則自動回滾事務

readOnly

指定事務是否為只讀事務,默認值為 false

rollbackFor

用于指定能夠觸發事務回滾的異常類型,并且可以指定多個異常類型

關于傳播行為propagation屬性:

  • REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  • SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
  • MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常。
  • REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。
  • NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
  • NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
  • NESTED:支持當前事務,如果當前事務存在,則執行一個嵌套事務,如果當前沒有事務,就新建一個事務。

3.2.2@Transactional失效場景

  1. 非 public 修飾的方法;
  2. timeout 超時時間設置過小;
  3. 代碼中使用 try/catch 處理異常;
  4. 調用類內部的@Transactional 方法;
  5. 數據庫不支持事務。
責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-09-28 09:07:54

注解失效場景

2022-08-09 09:34:32

Spring開發

2022-08-08 17:38:45

Spring策略事務

2021-04-14 15:17:08

Transaction代碼語言

2023-11-02 07:52:30

Java工具

2023-05-05 07:39:04

Spring事務面試

2022-09-20 22:27:08

事務失效public 修飾

2022-09-14 19:50:22

事務場景流程

2021-06-26 14:59:13

SpringTransaction執行

2022-03-24 07:38:07

注解SpringBoot項目

2023-08-29 10:51:44

2020-04-14 13:32:56

@Transacti失效場景

2023-09-08 08:52:12

Spring注解事務

2023-07-05 08:45:18

Spring事務失效場景

2025-01-06 09:26:49

2024-08-23 09:46:46

2020-11-17 08:28:55

數據庫

2025-04-11 01:00:00

線程鎖Spring事務

2024-11-13 19:03:14

2021-07-13 07:31:26

Springboot編程事務管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区大片 | 国产精品夜夜夜一区二区三区尤 | www国产成人 | 成年人在线视频 | 精品成人 | 久久久精品日本 | 少妇久久久| 精品国产99| 中文字幕日韩欧美 | 久久精品视频网站 | 国产精品一区二区在线 | 81精品国产乱码久久久久久 | 一区二区高清不卡 | www日韩欧美 | 亚洲97 | 亚洲免费在线视频 | 日韩不卡视频在线 | 国产高清一区二区三区 | 亚洲视频一区 | 日韩在线视频免费观看 | 手机在线观看 | 久久综合久久久 | 欧美成视频| 精品欧美激情在线观看 | 一呦二呦三呦国产精品 | 欧美日韩在线成人 | 成人在线视频网站 | 精品国产乱码久久久久久老虎 | av在线免费观看网站 | 日韩精品一区二区三区中文在线 | 91精品国产自产在线老师啪 | 久久国产精品99久久久大便 | 欧美另类视频在线 | 影音先锋久久 | 久久艹免费视频 | 久久国产香蕉 | 天堂av中文 | 91在线播| 一二三在线视频 | 一区二区三区在线 | 国产区第一页 |