我已经写了'phantom read'的代码,如果隔离级别不可序列化,我的代码应该打印不同的值,但是我有'可重复读取'隔离级别,它的工作原理类似于可序列化。它显示了我相同的数字,但应该第二次显示更大的数字。为什么这样?我有MySql数据库。这里我的例子:为什么'可重复读'隔离级别在Java中把我从'幻影读取'中拯救出来?
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 doc https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html只能从'幻影读取'保存。那么为什么从'phanotom read'保存可重复的读取水平?
可怕袋熊 - 重复的读取处理重复读取,serialisable处理幻读https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html –
看到http://stackoverflow.com/a/11044968/2310289 –