Java setAutoCommit 默认为true,即每条SQL语句在各自的一个事务中执行。
很多时候需要有多个操作在一个事务执行,如循环插入,此时可在插入开始前设置 conn.setAutoCommit(false) ,插入结束后才conn.commit(),并在catch中执行conn.rollback()。这样即使插入中间报错,前面执行没报错的也会回滚,从而保证数据的完整性。正确写法示例如下:
1 Connection con = null; 2 try { 3 con = getConnection(); 4 con.setAutoCommit(false); 5 /* 6 * do what you want here. 7 */ 8 con.commit(); 9 } catch (Throwable e) { 10 if (con != null) { 11 try { 12 con.rollback();// 设定setAutoCommit(false)若没有在catch中进行Connection的rollBack操作,操作的表就会被锁住,造成数据库死锁。虽然在执行con.close()的时候会释放锁,但若应用服务器使用了数据库连接池,连接不会被断开,从而不会放锁 13 } catch (SQLException e1) { 14 e1.printStackTrace(); 15 } 16 } 17 18 throw new RuntimeException(e); 19 } finally { 20 if (con != null) { 21 try { 22 con.close(); 23 } catch (SQLException e) { 24 e.printStackTrace(); 25 } 26 } 27 }
需要注意的是:设定setAutoCommit(false)若没有在catch中进行Connection的rollBack操作,操作的表就会被锁住,造成数据库死锁。虽然在执行con.close()的时候会释放锁,但若应用服务器使用了数据库连接池,连接不会被断开,从而不会放锁
参考资料:http://ygsilence.iteye.com/blog/1297762
时间: 2024-10-06 11:38:05