欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring框架事務屬性中事務隔離級別與傳播行為全面講解

 更新時間:2022年11月09日 09:53:51   作者:學習使我快樂T  
這篇文章主要介紹了Spring框架聲明式事務的事務隔離級別和事務傳播行為,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

一、事務隔離級別

①介紹

數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運行各個事務的能力,使它們不會相互影響,避免各種并發(fā)問題。一個事 務與其他事務隔離的程度稱為隔離級別。SQL標準中規(guī)定了多種事務隔離級別,不同隔離級別對應不同 的干擾程度,隔離級別越高,數(shù)據(jù)一致性就越好,但并發(fā)性越弱。

隔離級別一共有四種:

讀未提交:READ UNCOMMITTED

允許Transaction01讀取Transaction02未提交的修改。

讀已提交:READ COMMITTED、

要求Transaction01只能讀取Transaction02已提交的修改。

可重復讀:REPEATABLE READ

確保Transaction01可以多次從一個字段中讀取到相同的值,即Transaction01執(zhí)行期間禁止其它 事務對這個字段進行更新。

串行化:SERIALIZABLE

確保Transaction01可以多次從一個表中讀取到相同的行,在Transaction01執(zhí)行期間,禁止其它 事務對這個表進行添加、更新、刪除操作??梢员苊馊魏尾l(fā)問題,但性能十分低下。

②使用方式

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    @Transactional(
            isolation = Isolation.DEFAULT
    )
    public void buyBook(Integer userId, Integer bookId) {
//            try {
//                TimeUnit.SECONDS.sleep(5);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
        //查詢圖書的價格
        Integer price = bookDao.getPriceByBookId(bookId);
        //更新圖書的庫存
        bookDao.updateStock(bookId);
        //更新用戶的余額
        bookDao.updateBalance(userId,price);
        System.out.println(1/0);
    }
}

二、事務傳播行為

①介紹

當事務方法被另一個事務方法調(diào)用時,必須指定事務應該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務中 運行,也可能開啟一個新事務,并在自己的事務中運行。

②測試

public interface CheckoutService {
}
@Service
public class CheckoutServiceImpl implements CheckoutService {
}

在BookController中添加方法,然后到Service創(chuàng)建這個方法

@Autowired
private CheckoutService checkoutService;
public void checkout(Integer userId,Integer[] bookIds) {
    checkoutService.chekout(userId,bookIds);
}

CheckoutService接口添加方法

    void checkout(Integer userId, Integer[] bookIds);
}

CheckoutServiceImpl實現(xiàn)類添加方法

@Override
public void checkout(Integer userId, Integer[] bookIds) {
}

然后我們添加一個結(jié)賬操作

    public void checkout(Integer userId,Integer[] bookIds) {
        checkoutService.checkout(userId,bookIds);
    }
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    @Transactional(
            isolation = Isolation.DEFAULT
    )
    public void buyBook(Integer userId, Integer bookId) {
//            try {
//                TimeUnit.SECONDS.sleep(5);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
        //查詢圖書的價格
        Integer price = bookDao.getPriceByBookId(bookId);
        //更新圖書的庫存
        bookDao.updateStock(bookId);
        //更新用戶的余額
        bookDao.updateBalance(userId,price);
//        System.out.println(1/0);
    }
}
@Service
public class CheckoutServiceImpl implements CheckoutService {
    @Autowired
    private BookService bookService;
    @Override
    @Transactional
    public void checkout(Integer userId, Integer[] bookIds) {
        for (Integer bookId : bookIds) {
            bookService.buyBook(userId,bookId);
        }
    }
}

此時會發(fā)現(xiàn)我們兩個方法都添加了@Transactional注解,但它會默認的使用我們的結(jié)賬方法添加的注解

我們可以通過propagation中的Propagations屬性設置事務傳播行為

例:

@Transactional(propagation = Propagation.REQUIRED)使用的是我們調(diào)用者的事務

@Transactional(propagation = Propagation.REQUIRES_NEW)使用的是我們被調(diào)用的方法本身的事務

如:

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    @Transactional(
//            isolation = Isolation.DEFAULT
            propagation = Propagation.REQUIRES_NEW
    )
    public void buyBook(Integer userId, Integer bookId) {
//            try {
//                TimeUnit.SECONDS.sleep(5);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
        //查詢圖書的價格
        Integer price = bookDao.getPriceByBookId(bookId);
        //更新圖書的庫存
        bookDao.updateStock(bookId);
        //更新用戶的余額
        bookDao.updateBalance(userId,price);
//        System.out.println(1/0);
    }
}

到此這篇關于Spring框架事務屬性中事務隔離級別與傳播行為全面講解的文章就介紹到這了,更多相關Spring事務隔離級別與傳播行為內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個非常常見的任務,尤其是當我們需要在復雜條件下篩選數(shù)據(jù)時,如何編寫高效、簡潔且可維護的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • javz筆記之:有趣的靜態(tài)方法的使用

    javz筆記之:有趣的靜態(tài)方法的使用

    本篇文章介紹了,java中靜態(tài)方法的使用介紹,需要的朋友參考下
    2013-04-04
  • Java Arrays.fill()的具體使用

    Java Arrays.fill()的具體使用

    本文主要介紹了Java Arrays.fill()的具體使用,更好地理解Arrays.fill()方法的用法以及在實際應用中如何使用它,感興趣的可以了解一下
    2023-09-09
  • SpringEvents與異步事件驅(qū)動案例詳解

    SpringEvents與異步事件驅(qū)動案例詳解

    本文深入探討了SpringBoot中的事件驅(qū)動架構,特別是通過Spring事件機制實現(xiàn)組件解耦和系統(tǒng)擴展性增強,介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java實現(xiàn)調(diào)用外部程序的示例代碼

    Java實現(xiàn)調(diào)用外部程序的示例代碼

    本文主要介紹了Java實現(xiàn)調(diào)用外部程序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 解決java.util.NoSuchElementException異常正確方法

    解決java.util.NoSuchElementException異常正確方法

    java.util.NoSuchElementException是Java中的一種異常,表示在迭代器或枚舉中找不到元素,這篇文章主要給大家介紹了關于解決java.util.NoSuchElementException異常的相關資料,需要的朋友可以參考下
    2023-11-11
  • java應用程序如何自定義log4j配置文件的位置

    java應用程序如何自定義log4j配置文件的位置

    這篇文章主要介紹了java應用程序如何自定義log4j配置文件的位置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring依賴注入DI之三種依賴注入類型詳解

    Spring依賴注入DI之三種依賴注入類型詳解

    這篇文章主要介紹了Spring依賴注入DI之三種依賴注入類型詳解,通過 @Autowired 注解,字段注入的實現(xiàn)方式非常簡單而直接,代碼的可讀性也很強,事實上,字段注入是三種注入方式中最常用、也是最容易使用的一種,需要的朋友可以參考下
    2023-09-09
  • java設計模式之適配器模式

    java設計模式之適配器模式

    這篇文章主要為大家詳細介紹了java設計模式之適配器模式,介紹了什么是適配器模式,適配器模式的種類,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 聊一聊Java中的Steam流

    聊一聊Java中的Steam流

    當我們需要處理的數(shù)據(jù)量很大的時候,為了提高性能,就需要使用到并行處理,這樣的處理方式是很復雜的,流可以幫助開發(fā)者節(jié)約寶貴的時間,讓以上的事情變得輕松,本文就和大家聊一聊Java中的Steam流,感興趣的同學跟著小編一起來看看吧
    2023-07-07

最新評論