事务可以保证多个操作的原子性,要么全部成功,要么全部失败。
事务有四个特性ACID:
原子性(Atomicity) :事务中包括的操作要么做,要么都不做
一致性(Consistency):数据必须从一个状态变成另一个状态,不允许产生不一致
隔离性(Isolation):指一个事务执行不能其他的事务干扰
持续性(Durability):指一个事务一旦提交,它对数据的修改将变成永久性的。
代码:
/** * */ package com.bjpowernode.drp.util; import java.awt.image.ConvolveOp; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @ClassName:IdGenerator * @Description:ID生成器 * @author wm * @date 2016年1月15日下午6:41:06 */ public class IdGenerator { /** * 根据表名生成该表的序列 * @param tableName * @return 返回生成的序列 * 使用synchronized实现线程同步问题 */ //锁住线程1 //public static synchronized int generate(String tableName){ public static int generate(String tableName){ //TODO:id 生成器 //锁住线程2 /*synchronized (this) { }*/ //数据库的悲观锁 String sql="select value from t_table_id where table_name=? for update"; Connection conn =null; PreparedStatement pstmt=null; ResultSet rs=null; int value=0; try { conn=DbUtil.getConnection(); //开始事务 DbUtil.beginTransaction(conn); pstmt=conn.prepareStatement(sql); pstmt.setString(1, tableName); rs=pstmt.executeQuery(); if(!rs.next()){ throw new RuntimeException(); } value =rs.getInt("value"); value++; modifyValueField(conn,tableName,value); //提交事务 DbUtil.commitTransaction(conn); } catch (Exception e) { e.printStackTrace(); //回滚事务 DbUtil.rollbackTransaction(conn); throw new RuntimeException(); }finally{ DbUtil.close(rs); DbUtil.close(pstmt); DbUtil.resetConnection(conn);//重置connection的状态 DbUtil.close(conn); } return value; } /** * 根据表名更新序列字段的值 * @param conn * @param tableName * @param value * @throws SQLException */ private static void modifyValueField(Connection conn,String tableName,int value) throws SQLException{ String sql="update t_table_id set value=? where table_name=?"; PreparedStatement pstmt=null; try { pstmt=conn.prepareStatement(sql); pstmt.setInt(1, value); pstmt.setString(2, tableName); pstmt.executeUpdate(); } finally{ DbUtil.close(pstmt); } } public static void main(String[] args){ //完成测试 int retValue=IdGenerator.generate("t_client"); System.out.println(retValue); } }
事务调用的方法:
//开始事务 public static void beginTransaction(Connection conn){ try { if(conn!=null){ if(conn.getAutoCommit()){ conn.setAutoCommit(false); } } }catch (SQLException e) { } } //提交事务 public static void commitTransaction(Connection conn){ try { if(conn!=null){ if(!conn.getAutoCommit()){ conn.commit(); } } }catch (SQLException e) { } } //事务回滚 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) { } }