1. 程式人生 > >C#和JAVA中編寫事務代碼

C#和JAVA中編寫事務代碼

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中編寫事務代碼