日期:2014-05-17  浏览次数:20817 次

对 java.sql.Connection 的commit方法理解问题
先看代码:
public boolean addUser() {
int count = -1;
boolean autoCommit = true;
Connection conn = DB.getConn();
String sql = "insert into users() values(null, ? ,? ,'会员', ?, now(), now())" ;

PreparedStatement pstmt = DB.prepareStmt(conn, sql, Statement.RETURN_GENERATED_KEYS);
int key;
String sql2 = "insert into userMsg values(?, '', '', '', 0, 0, 0, '', '')";
PreparedStatement pstmt2 = DB.prepareStmt(conn, sql2);
ResultSet rsKey = null;
try {
autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);

pstmt.setString(1, userName);
pstmt.setString(2, password);
pstmt.setString(3, email);
count = pstmt.executeUpdate();

rsKey = pstmt.getGeneratedKeys();
rsKey.next();
key = rsKey.getInt(1);
pstmt2.setInt(1, key);
count += pstmt2.executeUpdate();

conn.commit();
conn.setAutoCommit(autoCommit);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DB.close(rsKey);
DB.close(pstmt2);
DB.close(pstmt);
DB.close(conn);
}

if(count >= 2) {
return true;
}
return false;
}

我的原意是在用户表里(users)添加好用户的时候就也顺便在用户信息表(userMsg)添加一个用户信息..用户信息表里的userID
是用户表的主键(自动增长),所以就要用getGeneratedKeys()方法得到刚自动生成的key,但是在执行第二条sql语句时出错了(sql2).但是sql1的信息已经插入到了数据库了...

我的问题就是commit()这个方法不是说是同时成功同时失败的吗???

------解决方案--------------------
出错之后,要rollback
------解决方案--------------------
对的你在catch里面要conn.rollback();不回滚事务当然会插入数据
------解决方案--------------------
将一个事务放入try{}中,catch的时候conn.rollback();然后要把conn回复现场,用conn.setAutoCommit(autoCommit);