2017-04-20 3 views
0

は、私がループし、値に、このテーブルにユーザーを挿入したいautocommitがfalseに設定されているときに、selectは最後に挿入された行を返しますか?

..私はユーザーとUser2、フォーマット USER1とユーザ名をという名前の列という名前のテーブルを持っていると言いますすべてのエントリは前のものに依存します。新しいエントリの値は、テーブル内のアルファベット順に最大のエントリ、つまりユーザによって生成されます。

AutoCommitがfalseに設定されている間にJDBC APIで挿入後にgetGeneratedKeysになる可能性があります。下記のような状況では

connection.setAutoCommit(false); 
while(someCondition) 
{ 
    ResultSet rs = connection.createStatement("select max(username) from users").executeQuery(); 
    if(rs.next()) 
    { 
     name= rs.getString("username"); //returns user1 
    } 
    String newName = generateNewName(name); // simply makes user1 -> user2 

    connection.createStatement("insert into users (name,...) values ("+newName+",...)").executeUpdate(); ///and inserts.. 
} 

はそれが私がループを開始前にテーブルでの最大列を返し、最後の挿入された値 かを 返すクエリを選択しますか?

+0

現在の最大値を返します。値をコミットするまで、別のセッション(=別のユーザー/アプリケーションなどの別の接続)で古い値が表示される可能性があります。そのため、単一のユーザー環境での使用が安全です。また、 'user2> user10'というのは辞書順であるので、あなたが期待する値と異なる最大値を得るかもしれないことに注意してください。 – Solarflare

+0

@Solarflareは返信に感謝します。あなたが任意のドキュメント参照を追加してそれを回答することができれば、私はそれを受け入れます。ところで、ユーザーの例は、私が実際に達成しようとしているものと同様のものに過ぎませんでしたが、警告に感謝します。 – alegria

答えて

0

最初に、データベース上のすべての変更が、自動コミットを使用してREAD_UNCOMMITEDのTransactionIsolationをすぐに優先することを確認します。代わりに、どこでも自動コミットを使用すると、その仕事もできます。

すぐにすべてのdbの変更が確認されたら、 selectの実行中にデータベースから最大のユーザーが送信されます。しかし、実際に結果を受け取ると、他のスレッドによって作成された追加のユーザーが存在する可能性があります。したがって、これは単一のスレッドが動作する場合にのみ機能し、現時点では意味をなさない可能性があります。

TL:DR いいえ、しないでください!

+0

あなたの返事をお寄せいただきありがとうございます。私が上記のシナリオにコメントしたように、私は示唆したことは明らかであり、明らかに私の状況を反映していません。私が質問したのは、状況に関する文書化された行動を見つけることができなかったため、私が期待する答えではないということです。しかし、マルチスレッドのアプローチについては、私はそのようなリスクがある可能性があるので、私は情報を感謝することはできませんでした。 – alegria

関連する問題