线程连接绑定
@Component
public class ConnectionUtils {
private ThreadLocal<Connection> tl =new ThreadLocal<>();
@Autowired
private DataSource ds;
/**
* 获取当前线程的连接
*/
public Connection getThreadConnection(){
//从threadLocal获取
Connection conn = tl.get();
try {
//判断线程有连接
if (conn==null){
conn =ds.getConnection();
tl.set(conn);
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void removeConnection(){
tl.remove();
}
}
事务管理类
@Component
public class TransactionManager {
@Autowired
private ConnectionUtils connectionUtils;
/**
* 开启事务
*/
public void beginTransaction(){
try {
connectionUtils.getThreadConnection().setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 提交
*/
public void commit(){
try {
connectionUtils.getThreadConnection().commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 回滚事务
*/
public void rollback(){
try {
connectionUtils.getThreadConnection().rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 释放事务
*/
public void close(){
try {
connectionUtils.getThreadConnection().close();
connectionUtils.removeConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
dao
return runner.query(utils.getThreadConnection(),"select * from account", new BeanListHandler<>(Account.class));
service
try {
//开启事务
manager.beginTransaction();
//执行操作
Account account =dao.findAccountByName(name);
//提交事务
manager.commit();
//返回结果
return account;
} catch (Exception e) {
//回滚操作
manager.rollback();
throw new RuntimeException("操作失败");
} finally {
//释放操作
manager.close();
}