java主從表事務控制(EJB3.0解決方法) – JAVA編程語言程序開發技術文章

/*********************************************************************/
主從表事務控制解決方法EJB3.0
author:chinayaosir
QQ:44633197  QQ Group:8284865,34610648
blog http://blog.csdn.net/chinayaosir


0.事務一致性控制解釋:
銀行卡轉帳操作事務:
用戶從張三帳號1111222333444轉帳8000.00到李四帳號2222333344445555!
步驟如下:
0.1驗證張三密碼和帳號正確!
0.2驗證李四帳號2222333344445555輸入正確!
0.3張三輸入轉帳金額8000.00!
0.4計算手續費4.00
0.5驗證張三帳號餘額>=8000.00+4.00


0.6李四帳號2222333344445555加上8000.00
0.7張三帳號1111222333444減去8004.00


0.8事務控制
0.6到0.7共2步沒有任何錯誤,則轉帳成功[提交事務]!
0.6到0.7共2步   有任何錯誤,則轉帳失敗[回滾事務]!
/*********************************************************************/
1.主表和從表事務控制要求


假設主表隻有一行數據,而從表有1到n行數據!
當我們一起保存或者刪除主表和從表,事務要求如下:
1.1.Create/Update事務要求
  如果主表Create/Update失敗而從表Create/Update成功;
  或者主表Create/Update成功而從表Create/Update失敗.
  則整個事務都回滾,結果是主從表保存失敗,達到事務控制要求.
  打個比方:完成一件事情要經過A->B->C->D->E->F共6步,
            如果6步中有一步出錯, 則Create/Update成功的部分被事務回滾強制取消;
            如果6步中沒有一步出錯,則mCreate/Update成功,則事務提交!


1.2.delete事務要求
  如果主表delete失敗而從表delete成功;
  或者主表delete成功而從表delete失敗.
  則整個事務都回滾,結果是主從表delete失敗,達到事務控制要求.


/*********************************************************************/
2.主表和從表事務控制EJB客戶調用方法
2.1Create/update調用:spdaotrans.SaveWithTransation(sphead, splist);
sphead=主表,1行記錄(最多隻能輸入一條)
splist=從表,2行記錄(可以輸入1-N條,N屬於自然數)


2.2Delete調用:spdaotrans.DeleteWithTransation(“PB100563”);
“PB100563″=主從表都使用的一個關鍵字PK,
DeleteWithTransation()方法由1-2-3步刪除數據構成一個整體事務!


2.3源碼參考
package com;
//import java basic package
import java.util.*;
import java.lang.String;
import java.text.SimpleDateFormat;
import javax.naming.InitialContext;


//import entity and service package
import shipping.entity.*;
import shipping.shippingDAO.spDAOTransRemote;


public class testTransation {
    public static void main(String[] args) {
        //************************begin************************************   
        try {
            //1.InitialContext and get spDAOTrans object
            InitialContext ctx = JNDIContext.getInitContextByRemote();
            spDAOTransRemote spdaotrans=(spDAOTransRemote)ctx.lookup(“spDAOTrans/remote”);
            //************************************************************       
            //2.Save  with transation test value=OK
            //SaveWithTransation(SSpMaster m,List<SSpDetail> d )
            System.out.println(“SaveWithTransation(SSpMaster m,List<SSpDetail> d )”);
            System.out.println(“fill SSpMaster data”);   
            //2.1fill SSpMaster
            SSpMaster sphead=new SSpMaster();   
            SSpMasterId spheadpk=new SSpMasterId();
            spheadpk.setPsonumber(“PB100563”);
            spheadpk.setSubcustom(“0000000000”);
            String s1=”10/29/2010″,s2=”10/25/2010″,s3=”10/30/2010″;
            SimpleDateFormat   sdf =  new SimpleDateFormat(“MM/dd/yyyy”);  
            Date d1=sdf.parse(s1);
            Date d2=sdf.parse(s2);
            Date d3=sdf.parse(s3);       


            sphead.setId(spheadpk);       
            sphead.setPshipDate(d1);
            sphead.setShippDate(d2);
            sphead.setShip2Date(d3);
            sphead.setCustomerid(“B.A.B.”);                           
            sphead.setDestinatio(“COLUMBUS, OHIO”);
            sphead.setCustofPoe(“LONG BEACH”);
            sphead.setId(spheadpk);           


            //2.2fill SSpDetail list
            System.out.println(“fill SSpDetail data”);   
   
            SSpDetailId spdetailpk1=new SSpDetailId();       
            SSpDetail spdetail1=new SSpDetail();   
            SSpDetailId spdetailpk2=new SSpDetailId();   
            SSpDetail spdetail2=new SSpDetail();
            ArrayList<SSpDetail> splist = new ArrayList<SSpDetail>();
           
            String sdate=”10/25/2010″;
            SimpleDateFormat   sdfDetail =  new SimpleDateFormat(“MM/dd/yyyy”);  
            Date d_shipdate=sdfDetail.parse(sdate);
            //2.3fill spdetailpk data
            spdetailpk1.setShippDate(d_shipdate);
            spdetailpk1.setPsonumber(“PB100563”);
            spdetailpk1.setOcNumber(“B1000577”);
            spdetailpk1.setItemnumber(“BY34317”);  

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *