私は 'phantom read'でコードを書いています。アイソレーションレベルがシリアライズ可能でない場合、私のコードは異なる値を出力するはずですが、 'repeatable read'アイソレーションレベルがあり、シリアライズ可能です。同じ数字が表示されますが、2番目に大きい数字が表示されます。なぜそうなのか?私はMySqlデータベースを持っています。ここに私の例:Javaで '反復可能な読み取り'の分離レベルが「Phantom reads」から私を救うのはなぜですか?
public class PhantomReadLesson {
static String url = "jdbc:mysql://localhost:3306/Lessons";
static String username = "root";
static String password = "1";
public static void main(String[] args) throws SQLException, InterruptedException {
try(Connection conn = DriverManager.getConnection(url, username, password);
Statement statement = conn.createStatement()) {
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
ResultSet rs = statement.executeQuery("Select count(*) from Books");
while(rs.next()){
System.out.println(rs.getInt(1));
}
new OtherTransaction2().start();
Thread.currentThread().sleep(1000);
rs = statement.executeQuery("Select count(*) from Books");
while(rs.next()){
System.out.println(rs.getString(1));
}
}
}
static class OtherTransaction2 extends Thread {
@Override
public void run() {
try(Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
stmt.executeUpdate("insert into Books (name) VALUES ('new Row')");
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
ここで私は模倣しています。 'repeatable_read'または 'serializable'レベルを使用すると、同じ数値が表示されます。 'read_commmited'または 'read_uncomited'レベルを使用すると、異なる数値が表示されます。しかし、javaの文書https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.htmlによると、 'phantom reads'からのシリアライズ可能な保存のみです。だから、なぜ反復可能な読み取りレベルを 'phanotom read'から保存するのですか? MySQL docsから
怖いウォンバット - 反復は、反復可能で読み取る扱う、ファントムを扱うserialisableがhttps://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html –
がhttp://stackoverflow.comを見る読み込み読み込み/ a/11044968/2310289 –