/*********************************************************************/
主從表事務控制解決方法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”);