事务
一,事务:一组逻辑操作单元,是数据从一种状态变换到宁一种状态。
事务处理:当在一个事务中执行多个操作时,要么所有的事务都被提交,这些修改就永久的保存下来,要么执行多个操作时,有一部分操作错误,那么整个事务全部视为错误,数据全部回滚到初始状态。
二,JDBC事务处理
数据的提交:数据一旦提交,就不可回滚
1,当一个连接对象被创建时,默认情况下时自动提交事务,每一次执行一条SQL语句时,执行成功就会向数据库自动提交,不能回滚。
2,关闭数据库连接,数据就会自动提交。即同一个事务的多个操作必须在同一个连接下。
下列代码:使用事务之后通用的增删改
public static void setSQL(Connection conn, String sql, Object... args) {
PreparedStatement ps = null;
try {
// 实例化PreparedStatement,预编译sql语句
ps = conn.prepareStatement(sql);
// 填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 执行sql语句
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源,连接不能关闭
JDBCUtils.closeRsource(null, ps);
}
}
测试方法是否正确:
Connection conn = null;
try {
// 获取一个连接,一个事务公用一个连接
conn = JDBCUtils.getConnection();
// 关闭连接的自动提交
conn.setAutoCommit(false);
String s1 = "UPDATE user_table SET balance=? WHERE `user`=?";
setSQL(conn, s1, 500, "AA");
// 模拟异常,测试事务是否正确
// System.out.println(10 / 0);
setSQL(conn, s1, 1500, "BB");
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
// 出现异常数据将回滚初始状态
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
// 事务完成后,将自动提交开启
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
// 关闭连接
JDBCUtils.closeRsource(conn, null);
}
}
三,数据库的并发问题
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读,不可重复读,幻读。隔离级别越高, 数据一致性就越好, 但并发性越弱。
数据库的四种隔离机制:
Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ。