zoukankan      html  css  js  c++  java
  • 事务--【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) {
                
            }
        }
  • 相关阅读:
    自定义控件详解(七):drawText()
    Android项目实战(三十六):给背景加上阴影效果
    Android项目实战(三十五):多渠道打包
    Android项目实战(三十三):AS下获取获取依赖三方的jar文件、aar 转 jar
    Android 方法数超过64k、编译OOM、编译过慢解决方案。
    自定义控件详解(六):Paint 画笔MaskFilter过滤
    浅谈Kotlin(四):控制流
    02-03 感知机对偶形式(鸢尾花分类)
    04-07 scikit-learn库之梯度提升树
    02-33 非线性支持向量机
  • 原文地址:https://www.cnblogs.com/wangmei/p/5136215.html
Copyright © 2011-2022 走看看