事务以及Spring中的事务管理一

来源:互联网 发布:农村淘宝的前景怎么样 编辑:程序博客网 时间:2024/06/06 07:22

首先讲一下事务的概念,

事务就是一系列的动作,它们被当做一个单独的工作单元.这些动作要么全部完成,要么全部不起作用

事务的四个关键属性(ACID)
原子性(atomicity):事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成要么完全不起作用.
一致性(consistency):一旦所有事务动作完成,事务就被提交.数据和资源就处于一种满足业务规则的一致性状态中.
隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏.
持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响.通常情况下,事务的结果被写到持久化存储器中.
下面举一个例子来说明事务:

有3张表:

1.用户余额表:

2.书

3.书的余量

下面我们来实现一个顾客买书的功能:

创建2个接口并且添加实现类:

ublic interface BookShopDao {    //根据书号获取书的单价    public int findBookPriceByIsbn(String isbn);    //更新书的数据库    public void updateBookStock(String isbn);    //更新用户的账户余额    public void updateUserAccount(String username,int price);}
@Repository("bookShopDao")public class BookShopDaoImpl implements BookShopDao {    @Autowired    private JdbcTemplate jdbcTemplate;    public int findBookPriceByIsbn(String isbn) {        String sql="SELECT price FROM book WHERE isbn=?";        return jdbcTemplate.queryForObject(sql,Integer.class,isbn);    }    public void updateBookStock(String isbn) {        /*检查书的库存是否足够,若不够,则抛出异常*/        String sqls="SELECT stock FROM book_stock WHERE isbn=?";        int stock=jdbcTemplate.queryForObject(sqls,Integer.class,isbn);        if(stock==0){            throw new BookStockException("库存不足!");        }        String sql="UPDATE book_stock SET stock=stock-1 WHERE isbn=?";        jdbcTemplate.update(sql,isbn);    }    public void updateUserAccount(String username, int price) {            String sqls="SELECT balance FROM account WHERE username=?";            int balance=jdbcTemplate.queryForObject(sqls,Integer.class,username);            if (balance<price){                throw new UserAccountException("用户余额不足!");            }            String sql="UPDATE account SET balance=balance-? WHERE username=?";            jdbcTemplate.update(sql,price,username);    }}
这里手动创建了几个异常,如果库存或者余额不足都会抛出异常。
public interface BookShopService {    public void purchase(String username,String isbn);}

@Service("bookShopService")public class BookShopServiceImpl implements BookShopService {    @Autowired    private  BookShopDao bookShopDao;    public void purchase(String username, String isbn) {        //获取书的单价        int price=bookShopDao.findBookPriceByIsbn(isbn);        //更新书的库存        bookShopDao.updateBookStock(isbn);        //更新用户余额        bookShopDao.updateUserAccount(username,price);    }}
新建测试类:

@Testpublic void testBookShopService(){        bookShopService.purchase("Jack","1001");    }
猜想:

根据前面表格中数据的情况我们可以看到Jack是买不起JAVA这本书的,所以会抛出异常,而异常抛出后下面的代码不会执行。

执行之:

可以看到isbn号为1001的书籍已经没有库存了,然而


Jack的余额并没有减少,事务的原子性遭到了破坏。



0 0
原创粉丝点击