首页 > 解决方案 > 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() 方法。我试图通过这段代码来做到这一点,它是事务隔离(在级别读取提交中)。但是,这并没有按预期工作,因为在转移方法运行时仍然可以移除汽车。你能帮我吗,我是使用足够的隔离级别还是在代码的正确位置有整个事务?

标签: postgresql

解决方案


推荐阅读