Spring手動提交事物

ContextLoaderListener監聽器的作用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。因爲它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。至於ApplicationContext.xml這個配置文件部署在哪,如何配置多個xml文件,書上都沒怎麼詳細說明。現在的方法就是查看它的API文檔。在ContextLoaderListener中關聯了ContextLoader這個類,所以整個加載配置過程由ContextLoader來完成。看看它的API說明

//通過ContextLoader獲取WebApplicationContext 

WebApplicationContext contextLoader = ContextLoader.getCurrentWebApplicationContext();
            //設置屬性的默認屬性
            DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
            //設置事務的傳播行爲,此處是設置爲開啓一個新事物
            definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            //設置事務的隔離級別,此處是讀已經提交
            definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
          
        for(int i=1;i<=pageCount;i++){
            /*if(i == 2){
                int j = 1/0;
            }*/
            //從spring容器對象中獲取DataSourceTransactionManager,這個根據配置文件中配置的id名(transactionManager)
            DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) contextLoader.getBean("transactionManager");
            //獲取事務狀態對象
            TransactionStatus transactionStatus = (TransactionStatus) transactionManager.getTransaction(definition);
            try{
                int offset = (i-1)*pageSize;
                orderVo.setOffset(offset);
                List<OrderTemp> list = this.orderTempMapper.grabYiHaoDianTempOrderToOrder(orderVo);
                for (OrderTemp orderTemp : list) {
                    //臨時表中的狀態是異步時才能導入到訂單表中
                    if(orderTempConstants.OR_STATUS_ASYN.equals(orderTemp.getOrStatus())){
                        if(judgeOrOrderNum(orderTemp.getOrNum(),orderTemp.getElactPlatId()) == null){
                            
                            createOrder(orderTemp,platAssoMap,dcBranchIdMap,userId);
                        }/*else{
                            Order order = judgeOrOrderNum(orderTemp.getOrNum(),orderTemp.getElactPlatId());
                            updateOrder(orderTemp, platAssoMap, dcBranchIdMap, userId, order);
                        }*/
                        
                    }
                    

                }

                //狀態刷新

                transactionStatus.flush();

                //事物提交

                transactionManager.commit(transactionStatus);

            }catch(Exception e){

               //異常回滾

                transactionManager.rollback(transactionStatus);
            }
            
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章