事务以及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
- 事务以及Spring中的事务管理一
- 事务以及Spring中的事务管理二
- Spring中的事务属性介绍以及声明式事务管理
- Spring中的事务属性介绍以及声明式事务管理
- spring中的事务管理(一)
- spring事务管理配置以及事务相关知识点
- Spring事务管理(一)什么是事务?
- 事务以及事务管理
- Spring学习总结(六)---Spring事务管理(一:事务回顾)
- Spring事务管理(二)Spring中的事务管控
- Spring学习-28:Spring中的事务管理之事务的回顾
- 事务基础知识-->Spring事务管理
- 事务基础知识-->Spring事务管理
- spring 事务管理 事务理解
- spring拦截器中的事务管理(一)
- [Spring]Spring中的事务管理
- spring事务管理 事务回滚
- Spring事务管理(5)-开启事务
- URLConnection抓取万方数据上的文献数据
- aravel-ide-helper的安装方法
- 文件短名转长名
- 啥是web service 和soap?
- 使用Spring注解,在静态方法中注入bean
- 事务以及Spring中的事务管理一
- matlab关于plotfit函数,lsqcurvefit函数,cftool工具箱的使用
- Spark Streaming 3:转换操作
- 有关一些swift 控件的基本创建和使用
- Android RadioGroup多行显示,解决单选问题
- [leetcode] 330. Patching Array
- webview 不显示图片
- java thread
- win10 cmd窗口切换目录并运行python代码