逐梦少年,看你能不能发现宝藏( 二 )


8.请简单介绍支持的常用数据库事务传播属性和事务的隔离级别?
事务的属性:
? *1.,用来设置事务的传播行为
? 事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法时使用原来的事务,还是开启了一个新的事务;
? -.,默认值,使用原来的事务
? -.,将原来的事务挂起,开启一个新的事务
? *2.,用来设置事务的隔离级别
? -.,可重复读,MySQL默认的隔离级别
? -.,已提交读,默认的隔离界别,开发时通常使用的隔离级别
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播 。例如:方法可能继续在现有事务中运行,也可能开启一个新的事务,并在自己的事务中运行 。
事务的传播行为可以由传播属性指定 。定义了7钟类传播行为
传播属性描述
如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
当前的方法必须重新启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中 。
当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
NEVER
当前的方法不应该运行在事务中,如果由运行的事务,就抛出异常
如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行 。
事务传播属性可以在@注解的属性中定义 。
自己遇到的坑,要想使用事务生效,当输出库更改失败时,你记得要抛出异常,否则没有异常,事务不会生效的
@Servicepublic class BookShopServiceImpl implements BookShopService {@AutowiredBookShopDao bookShopDao;@Transactional(propagation = Propagation.REQUIRES_NEW)@Overridepublic void purchase(int userId, String isbn) {//1.获取要买书的图书价格String bookPrice = bookShopDao.getBookPriceByIsbn(isbn);//2.更新图书的库存int i = bookShopDao.updateBookStock(isbn);if (i <1) {throw new RuntimeException("库存扣减失败");}//3.更新用户的余额int i1 = bookShopDao.updateAccountBalance(userId, bookPrice);if (i1 <1) {throw new RuntimeException("余额扣减失败");}}}@Servicepublic class CashierImpl implements Cashier {@Autowiredprivate BookShopService bookShopService;@Transactional(propagation = Propagation.REQUIRED)//用spring的声明式事务,来给checkout开启事务@Overridepublic void checkout(int userId, List isbns) {for (String isbn : isbns) {//调用BookShopService中买东西的方法bookShopService.purchase(userId,isbn);}}}class ShopbookApplicationTests {@Autowiredprivate Cashier cashier;@Testpublic void contextLoads() {//创建listArrayList isbns = new ArrayList<>();isbns.add("1001");isbns.add("1002");System.out.println("ok");//去结账cashier.checkout(1, isbns);}}SELECT PRICE FROM book WHERE ISBN = #{isbn}UPDATE book_stock SET STOCK= STOCK - 1 WHERE STOCK > 0 AND ISBN = #{isbn}UPDATE Accomt SET BALANCE=BALANCE - #{bookPrice} WHERE ID = #{userid} and BALANCE - #{bookPrice}>=0
说明:
1.传播行为
? 当的()方法被另一个事务方法()调用时,它默认会在现有的事务内运行 。这个默认的传播行为就是.因此在()方法的开始和终止边界内只有一个事务,这个事务只在()方法结束的时候被提交,结果用户一本书都买不了 。