JPA插入事务并发

时间:2012-09-13 05:54:43

标签: java jpa concurrency transactions

我有更多的理论问题: 什么时候将数据插入数据库?是在持久化之后还是在调用之后?因为我对唯一键(手动生成)有问题 - 它们会重复。我认为这是因为多个用户同时将数据插入到同一个表中。

更新1:

我在我的应用程序中生成密钥。键示例:'123456789123','123456789124','123456789125'...

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

更新2:

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

2 个答案:

答案 0 :(得分:1)

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

我问,因为同时填充数据库是正常的。

EDIT1:

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

private AtomicLong counter; //initialized somewhere else.

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

以下是OracleMySql等数据库序列的一些帮助。

答案 1 :(得分:1)

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

为了防止您在两个数据库中不完整插入,我建议您尝试使用XA transactions。这将允许您进行全部或全部插入和更新。因此,如果任何数据库上的任何操作都失败,那么所有内容都将被回滚。当然,XA交易存在不利因素;它们非常慢,并非所有数据库和数据库驱动程序都支持它。