Mysql会发生事物提交的情况
① DDL事件
② DML事件
可以使用conn.setAutoCommit(false);设置取消自动提交
③ 连接的关闭
如何保持事物的一致性:
使用同一个Connection连接 如果发生错误,则数据库可以Rollbake到操作之前
JDBC事物代码实现
代码:
public void update(Connection conn,String sql, Object ...args) throws SQLException, IOException, ClassNotFoundException {
PreparedStatement preparedStatement = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.execute();
jdbcUtils.close(null, preparedStatement);
}
@Test
/**
* JDBC事物
* 一组事物同时发生 保持一致性
*/
public void transactionTest1() {
Connection conn = null;
try {
conn = jdbcUtils.getConnection();
// 取消自动提交
conn.setAutoCommit(false);
String sql = "update money set money = money - 100 where password=?";
update(conn, sql, "BB");
System.out.println( 110/0);
sql = "update money set money = money + 100 where password=?";
update(conn, sql, "AA");
conn.commit();
} catch (Exception e) {
e.printStackTrace();
// 出现错误回滚数据
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
jdbcUtils.close(conn, null);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
代码成功运行,但是却没有达到回滚的效果,因为Mysql的MyISAM不支持事物回滚而
所以在代码中设置autocommit没有什么作用, 但不会报错
改变表格或数据库的储存引擎即可
ALTER TABLE 表名 ENGINE = InnoDB;