JDBC中的事务
JDBC中的默认事务是自动提交
将JDBC中的事务设置为手动提交
然后进行数据库的修改,如果没有出现异常并且数据正常,进行提交
如果出现异常,直接回滚数据
java
Connection conn = null;
PreparedStatement pr = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test", "root", "123456");
// 将自动提交禁用
conn.setAutoCommit(false);
String sql = "update t_user set realName = ? where id = ? ";
pr = conn.prepareStatement(sql);
pr.setString(1,"123");
pr.setInt(2,15);
int count = pr.executeUpdate();
pr.setString(1,"123");
pr.setInt(2,16);
count += pr.executeUpdate();
// 如果能到这里一定没有问题,将数据进行提交
conn.commit();
System.out.println(count);
} catch (ClassNotFoundException | SQLException e) {
// 如果出现异常,直接将数据库进行回滚
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (pr != null) {
}
if (conn != null) {
}
}
乐观锁和悲观锁
乐观锁:支持并发,事务不需要排队,之不要需要一个版本号
多线程之间同时进行数据的修改:
第一个线程先修改数据,并将版本号从1.0更新到1.1
第二个线程更新完数据后,发现版本号是1.1和最初的版本号不同,会自动回滚
如果多个线程更新数据,更新前版本号和更新后的版本号一致,那么数据安全,会提交
悲观锁(行级锁):事务必须排队,数据被锁住了,不允许并发
在查询语句后加上 for updata 就是行级锁
sql
select username
from t_user
where username like '%a_' for update