实现的效果是:  用户在购买股票的时候,钱减少!股票增加!

模拟出现的问题是!  用户在购买股票的时候,钱减少! 股票没有增加!

01.创建对应的数据库

02.创建对应实体类

  1. public class Account { //银行账户
  2. private Integer aid;
  3. private double money;
  4. private String aname;
  5. public Integer getAid() {
  6. return aid;
  7. }
  8. public void setAid(Integer aid) {
  9. this.aid = aid;
  10. }
  11. public double getMoney() {
  12. return money;
  13. }
  14. public void setMoney(double money) {
  15. this.money = money;
  16. }
  17. public String getAname() {
  18. return aname;
  19. }
  20. public void setAname(String aname) {
  21. this.aname = aname;
  22. }
  23. public Account(Integer aid, double money, String aname) {
  24. super();
  25. this.aid = aid;
  26. this.money = money;
  27. this.aname = aname;
  28. }
  29. @Override
  30. public String toString() {
  31. return "Account [aid=" + aid + ", money=" + money + ", aname=" + aname
  32. + "]";
  33. }
  34.  
  35. }

Account

  1. public class Stock { //股票
  2.  
  3. private Integer sid;
  4. private Integer amount;
  5. private String sname;
  6. public Integer getSid() {
  7. return sid;
  8. }
  9. public void setSid(Integer sid) {
  10. this.sid = sid;
  11. }
  12. public Integer getAmount() {
  13. return amount;
  14. }
  15. public void setAmount(Integer amount) {
  16. this.amount = amount;
  17. }
  18. public String getSname() {
  19. return sname;
  20. }
  21. public void setSname(String sname) {
  22. this.sname = sname;
  23. }
  24. public Stock(Integer sid, Integer amount, String sname) {
  25. super();
  26. this.sid = sid;
  27. this.amount = amount;
  28. this.sname = sname;
  29. }
  30. public Stock() {
  31. super();
  32. }
  33. @Override
  34. public String toString() {
  35. return "Stock [sid=" + sid + ", amount=" + amount + ", sname=" + sname
  36. + "]";
  37. }
  38.  
  39. }

Stock

03.创建对应的dao

  1. public interface StockDao {
  2.  
  3. //股票开户
  4. void openStock(String sName,Integer amount);
  5.  
  6. //增加股票
  7. void updateStock(String sName,Integer amount);
  8. }
  1. public interface AccoutDao {
  2.  
  3. //银行开户
  4. void openAccount(String aName,double money);
  5.  
  6. //购买股票
  7. void updateAccount(String aName,double money);
  8.  
  9. }

04.创建对应的service和自定义的异常类

  1. public interface StockService {
  2.  
  3. //股票开户
  4. void openStock(String sName,Integer amount);
  5. //银行开户
  6. void openAccount(String aName,double money);
  7.  
  8. /**
  9. * 谁花了多少钱 买了 多少股票??
  10. */
  11. void buyStock(String name,double money,Integer amount) throws BuyStockException;
  12.  
  13. }
  1. /**
  2. * @Transactional
  3. * isolation:事务的隔离级别
  4. * propagation:事务的传播行为
  5. * rollbackFor :需要回滚的异常类! 类型是Class
  6. * readOnly:对数据库的操作 只读! 默认false!
  7. * timeout:设置与数据库连接的超时时间! 单位是S! 默认值 -1!
  8. */
  9. public class StockServiceImpl implements StockService {
  10.  
  11. private StockDao stockDao;
  12. private AccoutDao accountDao;
  13.  
  14. //股票开户
  15. @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  16. @Override
  17. public void openStock(String sName, Integer amount) {
  18. stockDao.openStock(sName, amount);
  19. }
  20.  
  21. //银行开户
  22. @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  23. @Override
  24. public void openAccount(String aName, double money) {
  25. accountDao.openAccount(aName, money);
  26. }
  27.  
  28. /**
  29. * 谁花了多少钱 买了 多少股票??
  30. *
  31. * 01.减钱
  32. * 02.加股
  33. * @throws BuyStockException
  34. */
  35. @Transactional(rollbackFor=BuyStockException.class,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  36. @Override
  37. public void buyStock(String name, double money, Integer amount) throws BuyStockException {
  38. //银行账户减钱
  39. accountDao.updateAccount(name, money);
  40. if(1==1){ //模拟异常
  41. throw new BuyStockException("!!!购买股票失败.......");
  42. }
  43. stockDao.updateStock(name, amount);
  44. }
  45.  
  46. public StockDao getStockDao() {
  47. return stockDao;
  48. }
  49.  
  50. public void setStockDao(StockDao stockDao) {
  51. this.stockDao = stockDao;
  52. }
  53.  
  54. public AccoutDao getAccountDao() {
  55. return accountDao;
  56. }
  57.  
  58. public void setAccountDao(AccoutDao accountDao) {
  59. this.accountDao = accountDao;
  60. }
  61.  
  62. }
  1. /**
  2. * 自定义异常类
  3. */
  4. public class BuyStockException extends Exception {
  5.  
  6. public BuyStockException(String msg){
  7. super(msg);
  8. }
  9. }

05.创建applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:c="http://www.springframework.org/schema/c"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xmlns:aop="http://www.springframework.org/schema/aop"
  9. xsi:schemaLocation="
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx.xsd
  16. http://www.springframework.org/schema/aop
  17. http://www.springframework.org/schema/aop/spring-aop.xsd
  18. ">
  19.  
  20. <!-- 01.spring默认的数据源
  21. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  22. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  23. <property name="url" value="jdbc:mysql:///spring"/>
  24. <property name="username" value="t11"/>
  25. <property name="password" value="t11"/>
  26. </bean> -->
  27.  
  28. <!-- 02.dbcp数据源
  29. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  30. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  31. <property name="url" value="jdbc:mysql:///spring"/>
  32. <property name="username" value="t11"/>
  33. <property name="password" value="t11"/>
  34. </bean>-->
  35. <!-- 加载配置文件 数据库需要的4要素 -->
  36. <context:property-placeholder location="classpath:jdbc.properties"/>
  37.  
  38. <!-- 03.c3p0数据源 -->
  39. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  40. <property name="driverClass" value="${jdbc.driver}"/>
  41. <property name="jdbcUrl" value="${jdbc.url}"/>
  42. <property name="user" value="${jdbc.userName}"/>
  43. <property name="password" value="${jdbc.password}"/>
  44. </bean>
  45.  
  46. <!-- 配置stockDao -->
  47. <bean id="stockDao" class="cn.bdqn.dao.impl.StockDaoImpl" p:dataSource-ref="dataSource"/>
  48. <!-- 配置accountDao -->
  49. <bean id="accountDao" class="cn.bdqn.dao.impl.AccountDaoImpl" p:dataSource-ref="dataSource"/>
  50.  
  51. <!-- 配置stockService -->
  52. <bean id="stockService" class="cn.bdqn.service.impl.StockServiceImpl"
  53. p:accountDao-ref="accountDao" p:stockDao-ref="stockDao"/>
  54.  
  55. <!-- ==================================事务的配置=========================================-->
  56. <!-- 配置事务管理器 -->
  57. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  58. <property name="dataSource" ref="dataSource"></property>
  59. </bean>
  60.  
  61. <!-- 03.使用注解管理事务 -->
  62. <tx:annotation-driven transaction-manager="transactionManager"/>
  63.  
  64. <!-- 01.使用代理工厂管理事务 -->
  65. <!-- <bean id="serviceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  66. <property name="transactionManager" ref="transactionManager"/>绑定事务管理器
  67. <property name="target" ref="stockService"/> 声明需要代理的bean
  68. <property name="transactionAttributes">
  69. <props>在指定的切入点上配置事务属性
  70. <prop key="open*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
  71. -:发生异常回滚 +:发生异常提交
  72. <prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyStockException</prop>
  73. </props>
  74. </property>
  75. </bean> -->
  76.  
  77. <!-- 02.使用AspectJ来管理事务
  78. 切入点的匹配表达式
  79. public * addStock(Stock stock) : * 代表匹配所有的返回值类型
  80. public void *(Stock stock) : * 代表匹配所有没有返回值的方法
  81. public void addStock(..) : .. 匹配所有的参数以及类型
  82. * cn.bdqn.service.*.*(..) : 匹配cn.bdqn.service包下所有类的所有方法
  83. * cn.bdqn.service..*(..) : 匹配cn.bdqn.service包以及子包下所有类的所有方法
  84. * *..service.*.*(..) : 匹配包名有service的包下所有类的所有方法 !!常用!!
  85. -->
  86.  
  87. <!-- <tx:advice id="txAdvice" transaction-manager="transactionManager">绑定事务管理器
  88. 在连接点的方法上进行事务的属性配置
  89. <tx:attributes>
  90. <tx:method name="open*" isolation="DEFAULT" propagation="REQUIRED"/>
  91. <tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED" rollback-for="BuyStockException"/>
  92. </tx:attributes>
  93. </tx:advice>
  94.  
  95. 指定切入点
  96. <aop:config>
  97. <aop:pointcut expression="execution(* *..service.*.*(..))" id="myPoint"/>
  98. <aop:advisor advice-ref="txAdvice" pointcut-ref="myPoint"/>
  99. </aop:config> -->
  100.  
  101. </beans>

06.创建对应的测试类

  1. public class StockTest {
  2.  
  3. public static void main(String[] args) throws BuyStockException {
  4.  
  5. ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
  6. StockService service=(StockService) context.getBean("stockService");
  7. //service.openAccount("小猪", 5000);service.openStock("小猪", 20);
  8. service.buyStock("小猪", 250, 1);
  9. }
  10.  
  11. // 01.使用代理工厂 管理事务
  12. @Test
  13. public void testProxy() throws BuyStockException{
  14. ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
  15. StockService service=(StockService) context.getBean("serviceProxy");
  16. service.buyStock("小猪", 250, 1);
  17. }
  18.  
  19. // 02.使用AspectJ 和注解
  20. @Test
  21. public void testAop() throws BuyStockException{
  22. ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
  23. StockService service=(StockService) context.getBean("stockService");
  24. service.buyStock("小猪", 250, 1);
  25. }
  26.  
  27. }
  1. public class ReadeMe {
  2. /**
  3. * 事务:一个或者一组sql语句来完成一个功能!
  4. * 事务具有的四个特性: ACID特性!
  5. * 01.原子性:一个事物都是一个不可分割的单位!所有的操作 要么都执行,要么都不执行!
  6. * 02.一致性:事务必须是数据库从一个一致性的状态到达另一个一致性的状态!
  7. * 03.隔离性:一个事务的执行不会被其他的事务干扰!事务之间相互独立!
  8. * 04.持久性:事务一旦被提交!这个操作对数据库来说是永久性的!
  9. *
  10. *
  11. * Spring的事务管理:
  12. * 事务本事是数据库中的概念! 按理说应该在数据访问层(dao)!
  13. *
  14. * 绝大多数的情况下,我们是把事务 提升到 业务逻辑层!
  15. * 01.使用spring的事务代理工厂 来 管理事务!
  16. * 02.使用spring的注解 来 管理事务! 常用
  17. * 03.使用AspectJ的AOP配置 来 管理事务! 常用
  18. *
  19. * 需要掌握的两个属性名:
  20. *
  21. * isolation:事务的隔离级别!
  22. * 01.default:采用数据库默认的事务隔离级别
  23. * 001.mysql ---》repeatable-read
  24. * 002.oracle---》read_committed
  25. * 02. repeatable-read:可重复读取!解决了脏读,不可重复读,没解决幻读!
  26. * 03. read_committed:读已提交! 解决了脏读,没解决不可重复读,幻读!
  27. * 04. read_uncommitted:读未提交!什么都没有解决!
  28. * 05. serializable:串行化!级别最高!效率最低!不存在并发的问题!
  29. *
  30. *
  31. * propagation: 事务的传播行为:一共7中方式!
  32. * 01.required:是spring默认的事务传播行为!
  33. * 指定的方法必须在事务中执行!如果没有事务,则会自动创建一个事务!
  34. * 02.supports:有事务就在事务环境下执行,没有事务就直接执行!
  35. * 03.mandatory:
  36. * 指定的方法必须在事务中执行!如果没有事务,则抛出异常!
  37. * 04.requires_new:总是新创建一个事务!
  38. * 如果当前方法存在事务,则把当前的事务挂起,直到新创建的事务执行完毕后执行!
  39. * 05.not_supported:指定的方法不能在事务中执行!如果当前方法存在事务,则把当前的事务挂起!
  40. * 06.never:指定的方法不能在事务中执行!如果当前方法存在事务,则抛出异常!
  41. * 07.nested:指定的方法必须在事务内执行!
  42. * 如果执行的方法没有事务,则会创建一个事务!
  43. * 如果执行的方法没有事务,则会嵌套执行!
  44. *
  45. * timeout_default:定义了事务默认的超时时间!
  46. *
  47. *
  48. * Spring事务管理的接口:PlatformTransactionManager
  49. * 常用的两个实现类:
  50. * 01.使用jdbc和MyBatis时 使用DataSourceTrancationManager
  51. * 02.使用hibernate时 使用HibernateTrancationManager
  52. *
  53. * Spring事务回滚的方式:
  54. * 默认的回滚方式--》发生运行时异常回滚!发送受查异常时提交!
  55. * 受查异常肯定需要我们手动的设置回滚方式!
  56. * 运行时异常严重!一旦发生,JVM中止执行!
  57. *
  58. * 实现自定义异常类!RuntimeException --> Exception ---> Throwable
  59. *
  60. */
  61. }

spring08事务的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  3. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

随机推荐

  1. Android---55---Web Service概述

    Web Service 是什么? /*w3school*/ Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-co ...

  2. Nothing is impossible

    题记: <你凭什么上北大>--贺舒婷.依稀记得这篇文章是我高二的时候在<青年文摘>读到的,从此她就成了我为之奋斗的动力.北大,也是我梦中的学府,虽然自己也曾刻苦过,但是还是没有 ...

  3. 科班学习java遇到瓶颈,每天云里雾里怎么办?

    声明:这个问题困扰了我好久,今天在知乎找到了答案.知乎链接https://www.zhihu.com/question/24240982,感谢大神@Tony He的回答. 作者:Tony He链接:h ...

  4. oradebug工具使用(转载)

    在之前的HangAnalyze 中有使用oradebug命令,在这篇文章里,我们主要是重点看一下这个oradebug命令: Oracle HANGANALYZE 功能诊断 DB hanging htt ...

  5. s5_day1作业

    #1.使用while循环输出1 2 3 4 5 6 8 9 10 # s=0 # while s<10: # s+=1 # if s==7: # continue # print(s) # fo ...

  6. And Design:拓荒笔记——Upload上传

    And Design:拓荒笔记——Upload上传 上传前

  7. Spring4.2.3+Hibernate4.3.11整合( IntelliJ maven项目)

    1. 在IntelliJ中新建maven项目 给出一个建好的示例 2. 在pom.xml中配置依赖 包括: spring-context spring-orm hibernate-core mysql ...

  8. Javascript 中 == 与=== 对比

    首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 下面分别说明: 先说 === ...

  9. 《网络对抗》 逆向及Bof进阶实践

    <网络对抗> 逆向及Bof进阶实践 实践目标 注入一个自己制作的shellcode并运行这段shellcode: 实践步骤 准备工作 root@5224:~# apt-get instal ...

  10. 20145109 《Java实验报告1》

    Experiment Ⅰ --getting familiar with JDK (Linux + Eclipse) Content 1.Compile and run easy Java progr ...