Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 JPA插入事务并发_Java_Jpa_Concurrency_Transactions - Fatal编程技术网

Java JPA插入事务并发

Java JPA插入事务并发,java,jpa,concurrency,transactions,Java,Jpa,Concurrency,Transactions,我有更多的理论问题: 数据何时插入数据库?是在persist之后还是在commit被调用之后?因为我对唯一密钥(手动生成)有问题-它们会重复。我认为这是由于多个用户同时将数据插入同一个表 更新1: 我在应用程序中生成密钥。键示例:“123456789123”、“123456789124”、“123456789125” 密钥字段是varchar类型,因为有很多旧密钥(我无法删除或更改它们),如“VP123456”、“VP15S3456”。另一个问题是,在将密钥插入一个数据库后,必须将这些密钥插入另

我有更多的理论问题: 数据何时插入数据库?是在persist之后还是在commit被调用之后?因为我对唯一密钥(手动生成)有问题-它们会重复。我认为这是由于多个用户同时将数据插入同一个表

更新1:

我在应用程序中生成密钥。键示例:“123456789123”、“123456789124”、“123456789125”

密钥字段是varchar类型,因为有很多旧密钥(我无法删除或更改它们),如“VP123456”、“VP15S3456”。另一个问题是,在将密钥插入一个数据库后,必须将这些密钥插入另一个数据库。我不知道什么是DB序列和原子对象

更新2:


这些密钥用于财务文档,而不是数据库密钥。因此,它们必须是唯一的,但它们在编程中不作为对象键使用。

如何生成这些键?您是否尝试过在DB或原子对象中使用序列

我这样问是因为并发填充DB是正常的

编辑1:

您可以编写一个基于原子计数器返回新密钥的方法,这样您就知道,只要您请求一个新密钥,您就会收到一个唯一的密钥。这种策略可能会导致一些密钥被丢弃,但代价很小,除非要求数据库中的密钥是连续的

private AtomicLong counter; //initialized somewhere else.

public String getKey(){
  return "VP" + counter.incrementAndGet();
}

这里有一些关于中的DB序列等的帮助。

我建议您创建一个负责生成密钥的单例。确保只有在使用数据库中的最新值初始化singleton之后,才能获取新id


为了保护您不被不完整地插入到这两个数据库中,我建议您尝试使用。这将允许您进行全部或全部插入和更新。因此,如果任何数据库上的任何操作失败,所有操作都将回滚。当然,XA交易也有缺点;它们非常慢,并且不是所有的数据库和数据库驱动程序都支持它。

在应用程序中生成密钥通常不是一个好主意。有很多事情你需要照顾。使用原子数据类型只是开始。您必须绝对确保在任何给定时间只有一个id生成类的实例在运行。此外,您还必须注意适当的初始化等。如果人力资源允许,让数据库来处理这个问题。要么使用序列(最好的方法),要么,如果您需要做一些奇怪的事情来生成ID,则使用存储过程(可能在内部也使用序列)。问题是我无法更改数据库的许多方面,这太复杂了,无法解释原因——我只是不允许这样做。这些键是用一些逻辑生成的——新行是一个项目,它属于一个组。该组有自己的密钥(同样不是数据库密钥),它是项密钥的开头…您所说的“…这些密钥必须插入另一个数据库”是什么意思。它们也被用作钥匙吗?这些“密钥”真的有必要是您的技术数据库密钥吗?我更新了(更新2)我的问题。这个解决方案可以保护多用户吗?我的意思是,如果两个或多个用户同时在使用该应用程序的不同计算机上向同一个表插入数据?当然,这取决于你所说的“应用程序”是什么意思。如果您的程序在一台服务器上运行,并且有几个客户端连接到它,那么是的,它将(如果做得正确)防止并发问题。如果您在每个用户的PC上运行多个程序,并且只连接到相同的数据库,那么它将给您带来与开始时相同的问题。谢谢。我现在明白了,避免重复的唯一解决方案是在新行插入时生成该字段(我的应用程序是没有服务器的独立桌面应用程序)。我不能这样做,所以我会想出一些解决办法。