2017-11-20 13 views
0

私たちはmysqlデータで奇妙な問題に直面しています。私たちはidの現在のseqを保持するseqgeneratorテーブルを持っています。注文が行われるたびに、私のアプリケーションはseqgeneratorテーブルを照会して1つの番号を更新し、seqgeneratorに保存し直します。mysqlとJDBCが古くなったデータを返しました

ここで取得するクエリは、「order_seqからorder_idを選択してください」というメッセージが表示されます。 更新クエリ「update order_seq set order_id =?where appid =?」

これは先週までうまくいきました。先週、選択クエリはすでに1日前に使用されたIDを返しました.IDはリセットされ、そこから増分が開始され、1日のオーダーがオーバーライドされました。

+0

が鳴ります。 IDの再利用のためにデータが壊れるのを許すのはちょっと面倒です。すぐに失敗するはずです。 – Kayaman

+0

私はそれがコーディングの間違いであったことに同意します。私たちは、データベースのIDを使用しています。エンジニアは、誤ってコードを保存または更新するスタイルを使用しました。とにかくそれを修正しています。しかし、私はどのようにmysqlがIDを突然リセットしたのか知りたいです。 – sathishyellanty

答えて

1

あなたのデザインは非常に悪いです。

まず、Idは常に一意である必要があります。これにより、データが上書きされない可能性があります。

また、SQLを使用すると、1つのことで、あなたのIDを更新するたびに、必要はありませんので、

自動インクリメントは、新しいレコードがあるときに固有の番号が自動的に 生成することができる、自動インクリメントフィールドを持っていますテーブルに挿入されます。

は、多くの場合、これは我々が希望のプライマリキーフィールドが自動的に新しいレコードが

を挿入するたびに を作成する出典:あなたのデザインが悪すぎるよう https://www.w3schools.com/sql/sql_autoincrement.asp

+1

彼が 'ID'の文字列を使用している場合、彼は' java.util.UUID.randomUUID()。toString() 'を使ってjavaで一意のIDを生成できます。 – cdaiga

+0

生成されたIDを使用してno sqlデータベースに格納するため、自動インクリメントは使用できません。クエリで "for update"を使用していても、mysqlがどのように古いデータを返したかをチェックしたいと思っています。 – sathishyellanty

+0

@ sathishyellanty正しい取引処理を使用していますか? – Kayaman

関連する問題