C#和JAVA中編寫事務代碼
阿新 • • 發佈:2017-07-02
com creat .class eas ++ acc data savepoint return
C# DAL層代碼,運行多條增刪改,使用事務操作:
/// <summary> /// 運行 多條增刪改 (非查詢語句) /// </summary> /// <param name="strSql"></param> /// <param name="paras"></param> /// <returns></returns> public static int ExcuteNonQuerys(string[] strSqls, SqlParameter[][] paras2Arr) { int res = 0; //創建連接通道 using (SqlConnection conn = new SqlConnection(strConn)) { conn.Open(); //創建 事務 SqlTransaction tran = conn.BeginTransaction(); //創建命令對象 SqlCommand cmd = new SqlCommand(); //為命令對象指定連接通道 cmd.Connection = conn; //為命令對象指定事務 cmd.Transaction = tran; try { //循環運行sql語句 for (int i = 0; i < strSqls.Length; i++) { //獲得要運行的sql語句 string strSql = strSqls[i]; //為命令對象指定 此次運行的 sql語句 cmd.CommandText = strSql; //加入參數 if (paras2Arr.Length > i)//假設 參數2維數組的長度大於當前循環的下標 { cmd.Parameters.AddRange(paras2Arr[i]);//將 交錯數組 的第一個元素(事實上也是一個數組,加入到參數集合中) } res += cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } tran.Commit();//提交事務 } catch (Exception ex) { res = 0; tran.Rollback();//回滾事務 throw ex; } } return res; }
JAVA DAO層中編寫事務代碼:
@Test public void test(){ Connection conn = null; PreparedStatement stmt = null; Savepoint sp = null; try{ conn = JdbcUtil.getConnection(); conn.setAutoCommit(false); //開啟事務 stmt = conn.prepareStatement("update account set money=money-100 where name='aaa'"); stmt.executeUpdate(); stmt = conn.prepareStatement("update account set money=money+100 where name='bbb'"); stmt.executeUpdate(); sp = conn.setSavepoint();//設置回滾點 stmt = conn.prepareStatement("update account set money=money-100 where name='bbb'"); stmt.executeUpdate(); int i=1/0; //bbb給ccc轉賬時遇到異常 stmt = conn.prepareStatement("update account set money=money+100 where name='ccc'"); stmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); try { conn.rollback(sp); //回滾事務 } catch (SQLException e1) { e1.printStackTrace(); } }finally{ try { conn.commit(); //事務提交 } catch (SQLException e) { e.printStackTrace(); } JdbcUtil.release(null, stmt, conn); } }
JAVA Service層使用事務操作代碼:
import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; //把得到連接及事務有關的方法寫到此類中 public class TransactionUtil { private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); private static DataSource ds; static{ try { InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties props = new Properties(); props.load(in); ds = BasicDataSourceFactory.createDataSource(props); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDataSource(){ return ds; } public static Connection getConnection(){ try { Connection conn = tl.get(); if(conn==null){ conn = ds.getConnection(); tl.set(conn); } return conn; } catch (SQLException e) { throw new RuntimeException(e); } } public static void startTransaction(){ try { Connection conn = tl.get(); if(conn==null){ conn = getConnection(); // tl.set(conn); } conn.setAutoCommit(false); } catch (SQLException e) { throw new RuntimeException(e); } } public static void rollback(){ try { Connection conn = tl.get(); if(conn==null){ conn = getConnection(); // tl.set(conn); } conn.rollback(); } catch (SQLException e) { throw new RuntimeException(e); } } public static void commit(){ try { Connection conn = tl.get(); if(conn==null){ conn = getConnection(); // tl.set(conn); } conn.commit(); } catch (SQLException e) { throw new RuntimeException(e); } } public static void relase(){ try { Connection conn = tl.get(); if(conn!=null){ conn.close(); tl.remove(); } } catch (SQLException e) { throw new RuntimeException(e); } } }
C#和JAVA中編寫事務代碼