事务--【DRP】

事务可以保证多个操作的原子性,要么全部成功,要么全部失败。

事务有四个特性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) {
            
        }
    }
原文地址:https://www.cnblogs.com/wangmei/p/5136215.html