0

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

更新 1:

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

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

更新 2:

这些密钥用于财务文档而不是数据库密钥。所以它们必须是唯一的,但它们在编程的任何地方都不能用作对象键。

4

2 回答 2

1

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

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

编辑1:

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

private AtomicLong counter; //initialized somewhere else.

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

这里有一些关于OracleMySql等数据库序列的帮助。

于 2012-09-13T06:21:36.307 回答
1

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

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

于 2012-09-13T07:55:33.533 回答