List<String> msgs = new ArrayList<String>();
boolean result = Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
try {
//Db.update("update t_active_code set customer_id=?, account_id=?, used=? where id=?", user.getCustomerId(), user.getId(), 1, activeCode.getId());
ActiveCode updateCode = new ActiveCode();
updateCode.setCustomerId(user.getCustomerId());
updateCode.setAccountId(user.getId());
updateCode.setUsed(1);
updateCode.update();
//Db.update("update t_customer set order_level = order_level+1 where id=?", user.getCustomerId());
Customer customer = CustomerService.me.findById(user.getCustomerId());
Customer updateC = new Customer();
updateC.setId(customer.getId());
updateC.setId(customer.getOrderLevel()+1);
updateC.update();
这里不执行,导致业务大量出错,因为我用了大量的Db.update();
因为你上述多次操作数据库的所有代码处于一个事务中,所以事务提交之前数据库表中的数据是不会有任何变化的,而你靠后的数据库操作的 where 条件却依赖了这些变化,造成 where 条件实际上为 false, 最后看到的现象是数据库数据的变化不如自己预期
你可以将后方所依赖的数据库操作代码挪一部分到事务之前去,就能看到效果了
这个是 JDBC 事务的行为,jfinal 从来不会干预