ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring之事件 [打印本页]

作者: 勿忘初心做自己    时间: 2024-9-2 11:54
标题: Spring之事件
一、事件根本概念

   什么是事件
  
   事件的特性
  
二、基于注解的声明式事件

1、@Transactional注解标识的位置


2、事件属性:只读


使用方式:
  1. @Transactional(readOnly = true)
  2. public void buyBook(Integer bookId, Integer userId) {
  3.     //查询图书的价格
  4.     Integer price = bookDao.getPriceByBookId(bookId);
  5.     //更新图书的库存
  6.     bookDao.updateStock(bookId);
  7.     //更新用户的余额
  8.     bookDao.updateBalance(userId, price);
  9. }
复制代码
对增删改操纵设置只读会抛出下面非常:Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
3、事件属性:超时


使用方式:
  1. //超时时间单位秒
  2. @Transactional(timeout = 3)
  3. public void buyBook(Integer bookId, Integer userId) {
  4.     try {
  5.         TimeUnit.SECONDS.sleep(5);
  6.     } catch (InterruptedException e) {
  7.         e.printStackTrace();
  8.     }
  9.     //查询图书的价格
  10.     Integer price = bookDao.getPriceByBookId(bookId);
  11.     //更新图书的库存
  12.     bookDao.updateStock(bookId);
  13.     //更新用户的余额
  14.     bookDao.updateBalance(userId, price);
  15. }
复制代码
执行过程中抛出非常:org.springframework.transaction.TransactionTimedOutException: Transaction timed out: deadline was Fri Jun 04 16:25:39 CST 2022
4、事件属性:回滚策略


使用方式:
  1. @Transactional(noRollbackFor = ArithmeticException.class)
  2. //@Transactional(noRollbackForClassName = "java.lang.ArithmeticException")
  3. public void buyBook(Integer bookId, Integer userId) {
  4.     //查询图书的价格
  5.     Integer price = bookDao.getPriceByBookId(bookId);
  6.     //更新图书的库存
  7.     bookDao.updateStock(bookId);
  8.     //更新用户的余额
  9.     bookDao.updateBalance(userId, price);
  10.     System.out.println(1/0);
  11. }
复制代码
出现了数学运算非常(ArithmeticException),但是我们设置的回滚策略是,当出现ArithmeticException不发生回滚,因此购买图书的操纵正常执行
5、事件属性:隔离级别


隔离级别一共有四种:

各个隔离级别办理并发问题的能力见下表:
隔离级别脏读不可重复读幻读READ UNCOMMITTED-读未提交有有有READ COMMITTED-读已提交无有有REPEATABLE READ-可重复读无无有SERIALIZABLE-串行读无无无 各种数据库产物对事件隔离级别的支持程度:
隔离级别OracleMySQLREAD UNCOMMITTED-读未提交×√READ COMMITTED-读已提交√(默认)√REPEATABLE READ-可重复读×√(默认)SERIALIZABLE-串行读√√ 使用方式:
  1. @Transactional(isolation = Isolation.DEFAULT)//使用数据库默认的隔离级别
  2. @Transactional(isolation = Isolation.READ_UNCOMMITTED)//读未提交
  3. @Transactional(isolation = Isolation.READ_COMMITTED)//读已提交
  4. @Transactional(isolation = Isolation.REPEATABLE_READ)//可重复读
  5. @Transactional(isolation = Isolation.SERIALIZABLE)//串行化
复制代码
6、事件属性:流传行为

   什么是事件的流传行为?
  
   七种流传行为
  


   测试
  
  1. @Transactional(propagation = Propagation.REQUIRED)
  2. public void buyBook(Integer bookId, Integer userId) {
  3.     //查询图书的价格
  4.     Integer price = bookDao.getPriceByBookId(bookId);
  5.     //更新图书的库存
  6.     bookDao.updateStock(bookId);
  7.     //更新用户的余额
  8.     bookDao.updateBalance(userId, price);
  9. }
复制代码

  1. @Service
  2. public class CheckoutServiceImpl implements CheckoutService {
  3.     @Autowired
  4.     private BookService bookService;
  5.     @Override
  6.     @Transactional
  7.     //一次购买多本图书
  8.     public void checkout(Integer[] bookIds, Integer userId) {
  9.         for (Integer bookId : bookIds) {
  10.             bookService.buyBook(bookId, userId);
  11.         }
  12.     }
  13. }
复制代码
观察结果:




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4