• day23(事务管理)


    事务管理

        事务管理两种方式: 向下传递,ThreadLocal

    向下传递的方式(依赖)

        缺点:不利于测试

    Service层
    获取连接conn(Connection)
        转账(conn)
        收账(conn)
    提交事务
    catch(){
    事务回滚
    }
    
    dao层(通过service层传递过来的Connection对象来保证是同一个连接 )
             
    QueryRunner qr=new QueryRunner();
    qr.update(conn,sql,Parameter....);
    

      只要使用同一个连接(Connection对象)就会在一个事务,dao层的类中的方法只能访问一次数据库,如果多次访问数据库,就得把这个业务放在service层进行操作了,使用业务成进行多次调用到层的方法,事务管理主要是使用的Connection对象来管理事务的。

    使用线程来实现事务的管理

      使用ThreadLocal来管理当前线程

    使用jdbcUtils来进行事务的管理

        这样dao层获取连接只需要从JDBCUtils中获取连接即可,在业务层开启事务、提交事务、回滚事务。

    package com.baidu.utils;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCUtils2 {
    	//从c3p0里面来获取数据源
    	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
    	//这是当前线程对象
    	private static final ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    	//获取连接
    	public static Connection getConnection() throws SQLException {
    		Connection conn = null;
    		try {
    			conn = tl.get();
    			if(conn == null){
    				//从连接池中获取连接
    				conn = dataSource.getConnection();
    				//把获取的连接对象添加到当前线程中去
    				tl.set(conn);
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return conn;	
    	}
    	
    	//开启事务
    	public static void beginTransfer() throws SQLException{
    		Connection conn = tl.get();
    		conn.setAutoCommit(false);
    	}
           //提交事务
    	public static void commitTransfer() throws SQLException{
    		Connection conn = tl.get();
    		conn.commit();
    	}
            //回滚事务
    	public static void rollbackTransfer() throws SQLException{
    		Connection conn = tl.get();
    		conn.rollback();
    	}
            //获取数据源
    	public static DataSource getDataSource() {
    		return dataSource;
            }    
    }
    

      

  • 相关阅读:
    C++位运算详解
    SQL语句获取时间的方法
    redis在windows下安装和ThinkPHP中使用
    数据同步存储过程代码
    C#重写OnKeyPress方法
    SQL Server 2008数据库生成数据库脚本(并带数据)
    C#中邮件的发送
    C#中DGV分页功能
    C#中保持文件夹A与B同步
    C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/transfer_Manager.html
Copyright © 2020-2023  润新知