zoukankan      html  css  js  c++  java
  • 手动控制事务

    1、事务简单介绍:
            1)事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。

    这些操作要么都做,要么都不做,是一个不可切割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便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();
                }       
            }     

  • 相关阅读:
    工业以太网的现状与发展
    软件开发的7大原则
    white-space
    vue使用better-scroll做轮播图(1.X版本 比较简单)
    windows 查看端口占用
    使用通知notication pendingIntent 传递参数
    fragment 创建optionsmenu
    android viewmodel 带参数
    LifecycleObserver 生命周期检测
    过河问题
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7251857.html
Copyright © 2011-2022 走看看