第二天:购物车2.0-事务管理

事务管理核心:

    当需要同时更改几个数据库表,比如购物车点击提交订单需要同时更改:订单详情表、订单追踪表、订单信息表。要改的话就需要三个表都改,要不改就同时都不改。当一个表更改失败,另外两个表也不能更改。

  要实现这功能,就需要有一个WorkManager 类,同时对三个表更改,而且,需要把JDBC里的BaseDAO里的conn从workManager里传进去,需要保证对三个不同的子DAO用的是同一个connection。然后更改connection的提交方式为手动提交,当三个子DAO都完成操作,再用connection手动提交更改,这样就确保用的是同一个connection了。

  pubulic class WorkManager(){

    //这里的List<GoodsDetails> car 里的每一个元素,是产生不同订单明细的根源,因为一个订单可能有多个订单明细。所以传入car

    public void orderWork(OrderInfo or,List<GoodsDetails> car,Orderzz ordzz){

           //这里的用这个BaseDAO.URL,BaseDAO.USERNAME,BaseDAO.USERPWD是确保BaseDAO已经初始化,并且已经加载驱动

          Connection conn = DriverManager.getConnection(BaseDAO.URL,BaseDAO.USERNAME,BaseDAO.USERPWD);

       try{

          //记录原先的connection的提交方式,并在完成事物管理后,更改回以前的状态

          boolean flag = conn.getAutoCommit();

          //更改conn的提交方式为手动提交

          conn.setAutoCommit(flase);

          new OrderInfoDAO(conn).insertOrder(ord);

          new OrderzzDAO(conn).insertOrderzz(ordzz);

          //用car里面的元素产生订单明细,并调用subDAO来操作数据库

          for(int i=0;i<car.size();i++){

            String g_id = car.get(i).getGs.getGood_id;

            String count = car.get(i).getCount;

            //调用工具类产生ordermxid

            String ordermx_id = new createId.createOrdermxId;

            String order_id = ord.getOrderId;

            Ordermx ordmx = new Ordermx(ordermx_id,order_id,g_id,count);

            new OrdermxDAO(conn).insertOrdermx(ordmx);

           }

          //connection手动提交

          conn.Commit();

          //更改为原先的提交方式

          conn.setCommit(flag);

      }catch(exception e){

          try{

              //当抓取到错误的时候,回滚操作,保证所有的数据库都没有被更改

              conn.rollback;

            }catch{

               //回滚失败

            }

       }

   }

}

注:1、需要更改JDBC   BaseDAO里的构造函数。添加一个有参构造器public BaseDAO(Connection conn){ this.conn = conn};

   并在无参构造器里产生conn。以保证不管是调用有参还是无参的构造器,都能正常的使用

  2、资源关闭,原先的BaseDAO每当完成一次操作,就会关闭资源,但是在事物管理中,需要让在所有需要更改数据库完成之后,才能关闭资源。

回顾: JDBC  步骤:

    1、加载驱动:

      Class.forName("com.microsoft.sqlsever.jdbc.SQLServerDriver");

    2、连接数据库:

      Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=shopping","sa","123");

    3、创建命令执行对象:

      Statement stmt = conn.createStatement();

    4.执行命令

      Resultset rs = stmt.excuteQuery(sql);

      stmt.excuteUpdate(sql);

    5、释放资源

      closeRes();

    

时间: 2024-10-13 02:35:37

第二天:购物车2.0-事务管理的相关文章

spring3.0事务管理配置

转载:http://war-martin.iteye.com/blog/1396335 第一种配置方法:基于XML的事务管理 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等.详细配置如下: Xml代码   <!-- 定义事务处理类,不同的数据访问方式,事务处理类不同 比如:Hibernate操作的HibernateTransactionManager,JDBC操作的使用D

Spring 对事务管理的支持

1.Spring对事务管理的支持 Spring为事务管理提供了一致的编程模板,在高层次建立了统一的事务抽象.也就是说,不管选择Spring JDBC.Hibernate .JPA 还是iBatis,Spring都让我们可以用统一的编程模型进行事务管理. 在Spring事务管理SPI(Service Provider Interface)的抽象层主要包括3个接口,分别是PlatformTransactionManager.TransactionDefinition和TransactionStatu

spring+mybatis事务管理

spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数据库配置这方面的东西吧,今天给大家分享一下关于spring+mybatis管理事务这方面得知识吧. 先说说spring管理事务的集中方式,我所了解的有两种:第一种是编程式事务管理,第二种是声明式事务管理,而声明式事务管理中又有两种,一种是配置方式,另一种是声明式.我们在工作中一般都使用声明式事务管理

Spring3.0配置多个事务管理器(即操作多个数据源)的方法

大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义多个transactional manager,并为qualifier属性指定不同的值:然后在需要使用@Transactional注解的时候指定TransactionManager的qualifier属性值或者直接使用bean名称.配置和代码使用的例子: <tx:annotation-driven/

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

注解方式实现声明式事务管理

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 修改bean

Spring事务管理

写这篇博客之前我首先读了<spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

JDBC应用中的事务管理

在开发中,对数据库的多个表或者对一个表中的多条数据执行更新操作时要保证对多个更新操作要么同时成功,要么都不成功,这就涉及到对多个更新操作的事务管理问题了.比如银行业务中的转账问题,A用户向B用户转账100元,假设A用户和B用户的钱都存储在Account表,那么A用户向B用户转账时就涉及到同时更新Account表中的A用户的钱和B用户的钱,用SQL来表示就是: update account set money=money-100 where name='A'; update account set

[转]Spring3核心技术之事务管理机制

原文地址:http://chouyi.iteye.com/blog/1675199 Spring对事务的解决办法其实分为2种:编程式实现事务,AOP配置声明式解决方案. http://jinnianshilongnian.iteye.com/blog/1496953 Spring提供了许多内置事务管理器实现,常用的有以下几种: DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个ja