1、事务简介:
1)事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
2)事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。 ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
2、事务的应用
1、编辑事务操作类(ConnectionManager):
public class ConnectionManager { //设置当前线程变量,以确保获得的是同一Connection private static ThreadLocal<Connection> connectionHolder=new ThreadLocal<Connection>(); public static Connection getConnection(){ //获得线程中相应的Connection Connection conn=connectionHolder.get(); //如果当前线程中没有绑定相应的Connection if (conn==null){ try { JdbcConfig jdbcConfig=XmlConfigReader.getInstance().getJdbcConfig(); //加载驱动 Class.forName(jdbcConfig.getDriverName()); String url=jdbcConfig.getUrl(); String userName=jdbcConfig.getUserName(); String password=jdbcConfig.getPassword(); //建立连接 conn = (Connection) DriverManager.getConnection(url, userName, password); //将Connection设置到当前线程中 connectionHolder.set(conn); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系管理员!"); } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系管理员!"); } } return conn; } /** * 关闭连接 */ public static void closeConnection(){ //从ThreadLocal中获取Connection Connection conn=connectionHolder.get(); if (conn!= null){ try { conn.close(); //从ThreadLocal中清除Connection connectionHolder.remove(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 手动开启事务 * @param conn */ public static void beginTransaction(Connection conn){ try{ if (conn != null){ if (conn.getAutoCommit()){ conn.setAutoCommit(false); //手动提交 } } }catch(SQLException e){} } /** * 手动提交事务 * @param conn */ public static void commitTransaction(Connection conn){ try{ if (conn!=null){ if (!conn.getAutoCommit()){ conn.commit(); } } }catch(SQLException e){} } /** * 回滚事务 * @param conn */ public static void rollbackTransaction(Connection conn){ try{ if (conn!=null){ if (!conn.getAutoCommit()){ conn.rollback(); } } }catch(SQLException e){} } public static void resetConnection(Connection conn){ try{ if (conn!=null){ if (conn.getAutoCommit()){ conn.setAutoCommit(false); }else{ conn.setAutoCommit(true); } } }catch(SQLException e){} } }
2、手动事务操作
/** * 手动事物操作 */ public void addFlowCard(FlowCard flowCard) throw ApplicationException{ Connection conn=null; try{ //取得Connection conn=Connection.getConnection(); //开启事务 ConnectionManager.beginTransaction(conn); //操作1:添加1 //操作2:添加2 //提交事务 ConnectionManager.commitTransaction(conn); }catch(Exception e){ //回滚事物 ConnectionManager.rollbackTransaction(conn); }finally{ //关闭Connection并从ThreadLocal中清除 ConnectionManager.closeConnection(); } }