學生申請學科競賽活動,表單中有學科競賽的申報信息和部分附件,需要做到將上傳文件和表單數據提交保持一致性。
將上傳文件和插入表單數據放到事務匯總去處理,由於表單的數據我們可以控制,但是上傳的文檔不好控制。一方面我就把表單數據提交放置在文件上傳前面,這樣當表單數據提交發生異常我們可以回滾,文件並未上傳,當文件上傳發生異常時,我們可以回滾數據庫的數據,只有當文件正常上傳時我們才提交數據庫數據。。。
---------------------------------------------------------------------------------------------------------------------------------------
1 @Override 2 public boolean applActivity(XkTeam team, Document doc, DocType doctype, 3 FileInputStream fin) { 4 5 boolean flag = true; 6 FileOutputStream fos = null;//文檔輸出流 7 // ------------處理需要向數據庫提交的文檔、文檔類型及申報信息-------------------- 8 // 開啟事務,設置不自動提交 9 JDBCTools.startTransaction(); 10 11 try { 12 // 判斷是個人申報還是團體申報調用不同的方法 13 // 個人申報 14 if (team.getAppType() == 0) { 15 16 flag = idao.addPersonApp(team); 17 //更新當前申報人數 18 flag = idao.updateCurrentNum(team.getAppType(),1); 19 } 20 21 // 團體申報 22 if (team.getAppType() == 1) { 23 24 25 flag = idao.addTeamInfor(team); 26 flag = idao.addTeamMember(team.getMemberlist()); 27 //更新當前申報人數 28 flag = idao.updateCurrentNum(team.getActiId(), team.getMemberlist().size()); 29 } 30 31 if(doc != null && doctype != null){ //處理用戶是否上傳文檔 32 // 調用dao層插入文件的方法 33 flag = idao.addDocument(doc); 34 // 調用dao層插入文件類型方法 35 flag = idao.addDocType(doctype); 36 37 // ---------------處理上傳文檔------------ 38 // 1.創建上傳文檔File 39 File file = new File(doc.getDoc_path()); 40 // 2.創建寫文檔對象 41 fos = new FileOutputStream(file); 42 // 3.創建緩沖流 43 byte[] buffer = new byte[1024]; 44 int len = 0; 45 while ((len = fin.read(buffer)) > 0) { 46 // 寫入文件 47 fos.write(buffer, 0, len); 48 } 49 } 50 // 提交 51 JDBCTools.commit(); 52 } catch (Exception e2) { 53 e2.printStackTrace(); 54 // 發生異常回滾 55 JDBCTools.rollback(); 56 throw new RuntimeException("申報失敗,請聯系管理員!", e2); 57 } finally { 58 // 關閉資源 59 JDBCTools.setCommitTrue(); 60 JDBCTools.close(); 61 62 if(fos != null){ 63 try { 64 fos.close(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 } 69 } 70 71 return flag;
