postgresql - PostgreSQL JDBC 事务隔离
问题描述
我有这两个操作:
public class Car {
...
public void delete() throws SQLException {
Connection c = Db.getConnection();
c.setAutoCommit(false);
if (c.getTransactionIsolation() == 0) {
c.setTransactionIsolation(c.TRANSACTION_READ_COMMITTED);
}
String sql = "DELETE FROM cars WHERE id = ?";
try(PreparedStatement s = c.prepareStatement(sql)) {
s.setInt(1, id);
s.executeUpdate();
c.commit();
}
}
}
第二个:
public class CarTransfer {
public static boolean transfer(int person_id, int car_id, int other_shop_id) throws SQLException, Exception {
Car car = FindCar.getInstance().findById(car_id);
Person person = FindPerson.getInstance().findById(person_id);
try {
if (car == null) {
throw new CallException("Car doesn't exist");
}
} catch (CallException e) {
System.out.println(e.getMessage());
}
Connection c = Db.getConnection();
c.setAutoCommit(false);
if (c.getTransactionIsolation() == 0) {
c.setTransactionIsolation(c.TRANSACTION_READ_COMMITTED);
}
String sql = "";
try {
sql = "UPDATE car_belongs_shop SET shop_id = "+other_shop_id+" WHERE car_id = "+car.getId();
} catch (NullPointerException e) {
System.out.println("Did not find a car / shop");
return false;
}
try(PreparedStatement s = c.prepareStatement(sql)) {
s.executeUpdate();
try {
if (person.getCredit() < 100) {
c.rollback();
throw new CallException("Not enough credit");
}
else {
if (car == null) {
c.rollback();
throw new CallException("Car doesn't exist");
}
else {
c.commit();
person.buy(100);
}
}
} catch (CallException | NullPointerException e) {
System.out.println(e.toString());
return false;
}
}
c.setAutoCommit(true);
return true;
}
}
所以我想做的是将汽车从一家商店转移到另一家商店。但是在那个时候,当有人从数据库中删除那辆车时,可以在另一边完成一些其他事务(这是第一个方法 delete())。我想要做的是在传输运行时阻止任何 delete() 方法。我试图通过这段代码来做到这一点,它是事务隔离(在级别读取提交中)。但是,这并没有按预期工作,因为在转移方法运行时仍然可以移除汽车。你能帮我吗,我是使用足够的隔离级别还是在代码的正确位置有整个事务?
解决方案
推荐阅读
- java - 单击视频的缩略图并播放视频
- c++ - 从函数指针调用方法
- java - 下载 .csv 文件 Java6
- angular - 如何创建和更新可观察对象,这取决于 @Input
- c++ - 如何使用 sscanf 将字符串从文件解析为结构?
- asp.net-mvc - 在同一个域上运行 Asp.net MVC 和 React
- python-3.x - 数据集 API RecursionError:超出最大递归深度
- python - 根据关系模型值自动创建模型对象
- sql - 有没有办法提高在 select 子句中使用多个子查询的查询的性能
- google-apps-script - 如何用 mailto 替换变量:google doc apps 脚本中的链接