1. DBUtils应用事务方式一
public void transfer1(int sourceid,int targetid,double money) throws SQLException{
Connection conn = null;
try{
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false);
AccountDao dao = new AccountDao(conn);
Account a = dao.find(sourceid);
Account b = dao.find(targetid);
a.setMoney(a.getMoney()-money);
b.setMoney(b.getMoney()+money);
dao.update(a);
dao.update(b);
conn.commit();
}finally{
if(conn!=null) conn.close();
}
}
2. DBUtils应用事务方式二——ThreadLocal
public class JdbcUtils {
private static DataSource ds;
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
static{
try{
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
prop.load(in);
BasicDataSourceFactory factory = new BasicDataSourceFactory();
ds = factory.createDataSource(prop);
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection() throws SQLException{
try{
Connection conn = tl.get();
if(conn==null){
conn = ds.getConnection();
tl.set(conn);
}
return conn;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void startTransaction(){
try{
Connection conn = tl.get();
if(conn==null){
conn = ds.getConnection();
tl.set(conn);
}
conn.setAutoCommit(false);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void commitTransaction(){
try{
Connection conn = tl.get();
if(conn!=null){
conn.commit();
}
}catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void closeConnection(){
try{
Connection conn = tl.get();
if(conn!=null){
conn.close();
}
}catch (Exception e) {
throw new RuntimeException(e);
}finally{
tl.remove();
}
}
}
public void transfer2(int sourceid,int targetid,double money) throws SQLException{
try{
JdbcUtils.startTransaction();
AccountDao dao = new AccountDao();
Account a = dao.find(sourceid);
Account b = dao.find(targetid);
a.setMoney(a.getMoney()-money);
b.setMoney(b.getMoney()+money);
dao.update(a);
dao.update(b);
JdbcUtils.commitTransaction();
}finally{
JdbcUtils.closeConnection();
}
}