1.数据库基本事务写法
try (Connection conn = getConnection()) {
//设置不自动提交
conn.setAutoCommit(false);
Statement st = conn.createStatement();
String sql = "";
st.execute(sql);
conn.commit(); //手动提交
} catch (Exception e) {
conn.roolback(); //将事务回滚
LOG.error("execute sql error ");
throw e;
}
2.数据库连接connection对象的创建默认是设置自动提交事务的;意味着它执行每个语句后自动提交更改,即setAutoCommit(true),如果想同时执行多条语句需要将自动提交关闭setAutoCommit(false),当想要提交SQL语句的更改是调用commit()方法.
3.mysql 数据库事务只针对DML(UPDATE、INSERT、DELETE;增删改),查作为事务无意义;
DDL(CREATE、ALTER、DROP;表操作)无法包装成事务, 默认会提交commit;需要注意提交的脚本时,应当将DDL和DML语句以及DCL(权限等操作)语句严格分开,避免事务被隐性“破坏”,导致误操作情况发生。
比如你打开一个事务正在修改数据,恰好研发同事找你在这个库上新建一个表,剪完你发现自己数据改错了,此时再想回滚就悲剧啦!
又比如研发给你一个事务脚本,中间夹渣一个DDL语句,导致事务“中途”提交一次,等最后发现异常要回滚却发现只能回滚一部分。
总结:
当执行到DDL语句时,会隐式的将当前回话的事务进行一次“COMMIT”操作,因此在MySQL中执行DDL语句时,应该严格地将DDL和DML完全分开,不能混合在一起执行。