標籤:toc ops ndt puts rac 下標 thread apach 命令
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層中編寫事務代碼:
@Testpublic 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中編寫事務代碼