访问数据库的多个线程:一个具有长事务,一个具有短事务

时间:2010-12-20 05:47:31

标签: java database hibernate jpa

假设我有一个桌面应用程序,可以充当一堆汽车的车库:

@Entity
public class Garage {
    private List<Car> cars = new ArrayList<Car>();
    ...
}

桌面应用程序有一个“模拟”按钮,可以启动一个新线程并开始调用Garage,Car,Wheel等方法。此模拟可能需要长达10分钟才能运行。目前我有一个看起来像这样的课程:

beginTransaction();
Garage garage = garageDao.findGarage(1);
List<Car> cars = garage.getCars();
for (Car car : cars) {
    // call methods on the car to lazily fetch other things like wheels...
}
commitTransaction();

此代码仅执行“读取”而从不“写入”

所以上述情况可能需要很长时间,具体取决于汽车需要服务的程度。在发生上述情况时,用户可以继续使用桌面应用程序。他们可能会选择更改上述交易中使用的汽车颜色。

我的问题是,上述长期交易是否会阻止汽车颜色的变化?即,用户在桌面应用程序中更改汽车的颜色将被阻止提交更改,直到长事务完成为止?

3 个答案:

答案 0 :(得分:4)

为什么要这样?默认情况下,您使用乐观事务,因此没有锁定应用于正在读取的行(除非您没有向我们展示一些JPA2 lock()调用)。然后,事务提交应检查记录的乐观版本(如果您已定义版本)并使用它来决定是否提交更改。

答案 1 :(得分:0)

答案很可能取决于您使用的数据库,更重要的是哪个事务隔离级别。

但答案通常是:它们不应该阻止(但正如我所说,取决于数据库和事务级别)。

答案 2 :(得分:0)

如上所述:

通常,只读操作不应阻止数据库中的写操作。 所以你的长读取线程不应该阻止短写操作。

我认为可以为数据库和连接配置隔离级别,写入可以被长读取语句阻止,但这不是我所知道的任何数据库类型的默认值。