Spring中的事务管理实例详解(2)

public interface BookShopDao {
    //根据书号获取书的单价
    public int findBookPriceByIsbn(String isbn);
    //更新书的库存,使书号对应的库存-1
    public void updateBookStock(String isbn);
    //更新用户的账户余额:使username的balcance-price
    public void updateUserAccount(String username, int price);
   
}

BookShopDaoImpl

代码如下:


package com.yl.spring.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("bookShopDao")
public class BookShopDaoImpl implements BookShopDao {

@Autowired
    private JdbcTemplate JdbcTemplate;
   
    @Override
    public int findBookPriceByIsbn(String isbn) {
        String sql = "SELECT price FROM book WHERE isbn = ?";
       
        return JdbcTemplate.queryForObject(sql, Integer.class, isbn);
    }

@Override
    public void updateBookStock(String isbn) {
        //检查书的库存是否足够,若不够,则抛出异常
        String sql2 = "SELECT stock FROM book_stock WHERE isbn = ?";
        int stock = JdbcTemplate.queryForObject(sql2, Integer.class, isbn);
        if (stock == 0) {
            throw new BookStockException("库存不足!");
        }
        String sql = "UPDATE book_stock SET stock = stock - 1 WHERE isbn = ?";
        JdbcTemplate.update(sql, isbn);
    }

@Override
    public void updateUserAccount(String username, int price) {
        //检查余额是否不足,若不足,则抛出异常
        String sql2 = "SELECT balance FROM account WHERE username = ?";
        int balance = JdbcTemplate.queryForObject(sql2, Integer.class, username);
        if (balance < price) {
            throw new UserAccountException("余额不足!");
        }       
        String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";
        JdbcTemplate.update(sql, price, username);
    }

}

BookShopService

复制代码 代码如下:

package com.yl.spring.tx;
public interface BookShopService {
    public void purchase(String username, String isbn);
}

BookShopServiceImpl

代码如下:


package com.yl.spring.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService {

@Autowired
    private BookShopDao bookShopDao;
   
    /**
    * 1.添加事务注解
    * 使用propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时如何使用事务。
    * 默认取值为REQUIRED,即使用调用方法的事务
    * REQUIRES_NEW:使用自己的事务,调用的事务方法的事务被挂起。
    *
    * 2.使用isolation 指定事务的隔离级别,最常用的取值为READ_COMMITTED
    * 3.默认情况下 Spring 的声明式事务对所有的运行时异常进行回滚,也可以通过对应的属性进行设置。通常情况下,默认值即可。
    * 4.使用readOnly 指定事务是否为只读。 表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务。若真的是一个只读取数据库值得方法,应设置readOnly=true
    * 5.使用timeOut 指定强制回滚之前事务可以占用的时间。
    */
    @Transactional(propagation=Propagation.REQUIRES_NEW,
            isolation=Isolation.READ_COMMITTED,
            noRollbackFor={UserAccountException.class},
            readOnly=true, timeout=3)
    @Override
    public void purchase(String username, String isbn) {
        //1.获取书的单价
        int price = bookShopDao.findBookPriceByIsbn(isbn);
        //2.更新书的库存
        bookShopDao.updateBookStock(isbn);
        //3.更新用户余额
        bookShopDao.updateUserAccount(username, price);;
    }
}

BookStockException

代码如下:


package com.yl.spring.tx;
public class BookStockException extends RuntimeException {

/**
    *
    */
    private static final long serialVersionUID = 1L;

public BookStockException() {
        super();
        // TODO Auto-generated constructor stub
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6f4c034149ca83dd3350b7f13a63c498.html