例: 现有两个类Cla_A和Cla_B,Cla_B是一个父类,里面封装的是操作DB的方法,即别的类中要操作DB,如Insert、Updata、Delete或Select,只需调用Cla_B中相关类,传入相关参数就可以。我现在在Cla_A中有一个方法,其需要进行多个表的Insert操作,现在在Cla_A的方法中加入一个事务,在事务中间调用Cla_B中的相关方法,如果我最后一个Insert有问题,那个这事务会进行回滚操作,现在我想问的是:那在这个Insert之前的Insert会回滚吗?我现在遇到的问题是出现上述情况,那事务回滚是有问题的,事务没有起到其应有的作用。PS:我听说事务不能进行跨类或方法的,即操作出了事务所在方法就不会被纳入到事务中来,就像上面例中的情形一样。不知这种说法对不对?有没有办法实现上述例中的操作模式,并且事务也能起作用。在线等,万分感谢!!!
lz先需要说明是用什么做事务的管理,EJB还是Spring Transaction Manager,或者Hibernate Transaction?
我们没有用Spring和Hibernate,用的是JDBC进行操作的,因为这是与手机端程序相关的,所以速度要求比较高。
......
con.close; //做完事马上关闭connection那么显然,Cla_A在调用这些方法的时候是没有机会控制事务的。如果Cla_B的CRUD方法是这样:Connection con = DB.getCurrentCon();
...... //只管取得已经打开的connection,把打开/关闭connection的责任交给调用方这样你的Cla_A才“有可能”具备管理事务的权限。涉及到具体的事务机制就得根据实际情况来说了,目前比较常见的事利用ThreadLocal来持有当前线程的connection。
可以使用ThreadLocal,在当前线程中使用同一个连接
我的操作是这样的:在Cla_A的方法中从连接池中获Connection,并在该方法中开启和提交(回滚)事务,在这中间调用Cla_B的CRUD方法。这样中间的操作会被纳入到事务中去吗?
Cla_A中:....
con = dbPool.getSqlConn();
con.setAutoCommit(false);
....
sql = (String) SimpleProperties.getStaticProperties().get("INSERT_ORDER_HEADERS");
insertDatasToDB_Code(sql, insertOrderHeadTemp_);
....
con.commit();
Cla_B:....
public String insertDatasToDB_Code(String sql, String[] parameter) throws SQLException {
String code = "-1";
PreparedStatement ps = null;
String l_sql = SqlTransform.transSql(sql, parameter); try {
if (con != null) {
con.close();
con = null;
}
con = dbPool.getSqlConn();
ps = con.prepareStatement(l_sql);
ps.executeUpdate();
code = "-1";
} catch (SQLException ex) {
// 2627为违反主键约束错误代码
// ex.printStackTrace();
code = "" + ex.getErrorCode();
log.info("操作数据库异常代码:" + code);
log.error("insertDatasToDB_Code Error: " + ex.getMessage());
log.error("SQL: " + l_sql);
} catch (Exception ex) {
ex.printStackTrace();
log.error(ex.getMessage());
log.error("SQL: " + l_sql);
} finally {
if (ps != null) {
ps.close();
ps = null;
}
if (con != null) {
con.close();
con = null;
}
}
return code;
}
....