私のオフィスには、リモートWebサーバーに注文プラットフォームがあり、ローカルの本番マシンがあります。両方のWebサーバーが同じリモートMySQL(InnoDB)データベースにアクセスします。
私の問題:2〜3のトランザクションが開いている場合、制作には数分かかります。今回は、新しい請求書番号を生成してインクリメントします。最新の請求書番号は、データベースの番号テーブルに保存されます。
public Long getNewInvoiceNumber() {
Criteria crit = getSession().createCriteria(Numbers.class);
Numbers n = ((Numbers)crit.uniqueResult());
Long newNumber = n.getInvoiceNumber() + 1L;
n.setInvoiceNumber(newNumber);
return newNumber;
}
これで、誰かが生産中に新しい注文を保存しているときに、同じ番号テーブルにアクセスして別の番号(請求書ではない)を生成しています。プロダクションによって処理されたすべての注文は、正しい請求書番号で保存されます。ただし、Numbers-Tableは最新の値で更新されず、請求書番号は生産前と同じままです。
トランザクションの1つに「古いテーブル」メッセージが表示されることを理解しています。しかし、MySQL / Hibernate / Javaの動作はどうですか?ロールバックしてこの危険なデータベースの不整合を回避できるように、トランザクションの1つから例外を取得したいと思います。
編集:
これはテーブルがどのようにNumbers
見えるかです:
id | invoice_number | tag_number
0 | 16533 | 1055
id
主キーです。この1行にのみアクセスし、必要な数を増やします。
編集2: わかりました、このテーブル構造はちょっと悪いようです。私はそれを次のように更新しました:
id | number
invoice_number | 16533
tag_number | 1055
これで、各行に個別にアクセスできます。それでも私の問題が解決するかどうかはわかりません。