Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个线程访问数据库:一个具有长事务,一个具有短事务_Java_Database_Hibernate_Jpa - Fatal编程技术网

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

Java 多个线程访问数据库:一个具有长事务,一个具有短事务,java,database,hibernate,jpa,Java,Database,Hibernate,Jpa,比如说,我有一个桌面应用程序,可以作为一堆汽车的车库: @Entity public class Garage { private List<Car> cars = new ArrayList<Car>(); ... } @实体 公共级车库{ 私家车列表=新的ArrayList(); ... } 桌面应用程序有一个“模拟”按钮,可以启动一个新线程,并开始调用车库、汽车、车轮等的方法。此模拟运行可能需要10分钟。目前,我有一个类似这样的类: beginT

比如说,我有一个桌面应用程序,可以作为一堆汽车的车库:

@Entity
public class Garage {
    private List<Car> cars = new ArrayList<Car>();
    ...
}
@实体
公共级车库{
私家车列表=新的ArrayList();
...
}
桌面应用程序有一个“模拟”按钮,可以启动一个新线程,并开始调用车库、汽车、车轮等的方法。此模拟运行可能需要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();
beginTransaction();
车库=garageDao.findGarage(1);
List cars=garage.getCars();
用于(汽车:汽车){
//调用汽车上的方法来懒洋洋地获取其他东西,如车轮。。。
}
提交交易();
此代码只进行“读取”,从不进行“写入”

因此,根据汽车对服务的需求程度,上述操作可能需要很长时间。当发生上述情况时,用户可以继续使用桌面应用程序工作。他们可以选择更改上述交易中使用的汽车的颜色


我的问题是,上述长期交易是否会阻止汽车颜色的变化?i、 e.在长事务完成之前,在桌面应用程序中更改汽车颜色的用户将无法提交更改?

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


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

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

如上所述:

通常,只读操作不应阻止数据库中的写入操作。 因此,您的长读线程不应该阻止短写操作


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

为什么需要读取事务?您正在使用延迟抓取吗?“更新线程”必须是单个事务单元吗?还是没有更新?你说“这段代码只做‘读’而不做‘写’”。然后,就像saugata所问的那样,你为什么需要事务?是的,在汽车上调用的方法可能类似于getWheels(),它们被懒散地获取