Spring框架事務(wù)屬性中事務(wù)隔離級別與傳播行為全面講解
一、事務(wù)隔離級別
①介紹
數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個事務(wù)的能力,使它們不會相互影響,避免各種并發(fā)問題。一個事 務(wù)與其他事務(wù)隔離的程度稱為隔離級別。SQL標(biāo)準(zhǔn)中規(guī)定了多種事務(wù)隔離級別,不同隔離級別對應(yīng)不同 的干擾程度,隔離級別越高,數(shù)據(jù)一致性就越好,但并發(fā)性越弱。
隔離級別一共有四種:
讀未提交:READ UNCOMMITTED
允許Transaction01讀取Transaction02未提交的修改。
讀已提交:READ COMMITTED、
要求Transaction01只能讀取Transaction02已提交的修改。
可重復(fù)讀:REPEATABLE READ
確保Transaction01可以多次從一個字段中讀取到相同的值,即Transaction01執(zhí)行期間禁止其它 事務(wù)對這個字段進(jìn)行更新。
串行化:SERIALIZABLE
確保Transaction01可以多次從一個表中讀取到相同的行,在Transaction01執(zhí)行期間,禁止其它 事務(wù)對這個表進(jìn)行添加、更新、刪除操作。可以避免任何并發(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); } }
二、事務(wù)傳播行為
①介紹
當(dāng)事務(wù)方法被另一個事務(wù)方法調(diào)用時,必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中 運(yùn)行,也可能開啟一個新事務(wù),并在自己的事務(wù)中運(yù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實(shí)現(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注解,但它會默認(rèn)的使用我們的結(jié)賬方法添加的注解
我們可以通過propagation中的Propagations屬性設(shè)置事務(wù)傳播行為
例:
@Transactional(propagation = Propagation.REQUIRED)使用的是我們調(diào)用者的事務(wù)
@Transactional(propagation = Propagation.REQUIRES_NEW)使用的是我們被調(diào)用的方法本身的事務(wù)
如:
@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); } }
到此這篇關(guān)于Spring框架事務(wù)屬性中事務(wù)隔離級別與傳播行為全面講解的文章就介紹到這了,更多相關(guān)Spring事務(wù)隔離級別與傳播行為內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼
本文主要介紹了Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05解決java.util.NoSuchElementException異常正確方法
java.util.NoSuchElementException是Java中的一種異常,表示在迭代器或枚舉中找不到元素,這篇文章主要給大家介紹了關(guān)于解決java.util.NoSuchElementException異常的相關(guān)資料,需要的朋友可以參考下2023-11-11java應(yīng)用程序如何自定義log4j配置文件的位置
這篇文章主要介紹了java應(yīng)用程序如何自定義log4j配置文件的位置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12