想知道为什么会这样?
代码如下:
public static void main(String[] args) {
String dbName = "F:/firstdb";
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String protocol = "jdbc:derby:";
try{
Class.forName(driver).newInstance();
System.out.println("Loaded the appropriate driver");
Connection conn = DriverManager.getConnection(protocol + dbName + ";");
System.out.println("Connected to and created database " + dbName);
conn.setAutoCommit(false);
Statement stat = conn.createStatement();
String command = "update my_test set NAME='1234' where ID='03'";
stat.executeUpdate(command);
//conn.rollback();
PreparedStatement state = conn.prepareStatement("select * from my_test", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = state.executeQuery();
int i = 1;
while(rs.next()){
if(i < 4){
System.out.printf(rs.getString(1) + " ");
System.out.printf(rs.getString(2) + " ");
System.out.printf(rs.getString(3) + " ");
System.out.printf(rs.getString(4) + "\n");
i++;
}else{
rs.relative(-2);
System.out.println("finally");
System.out.printf(rs.getString(1) + " ");
System.out.printf(rs.getString(2) + " ");
System.out.printf(rs.getString(3) + " ");
System.out.printf(rs.getString(4) + "\n");
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
结果如下:
Loaded the appropriate driver
Connected to and created database F:/firstdb
01 男 10 LiSi
02 女 20 ZhangSan
03 男 40 1234
finally
02 女 20 ZhangSan
如果把update相关语句注释掉,那么结果如下:
Loaded the appropriate driver
Connected to and created database F:/firstdb
01 男 10 LiSi
02 女 20 ZhangSan
03 男 40 123
finally
02 女 20 ZhangSan
你这是没有明白什么叫事务,在数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,这是一种机制,用以维护数据库的完整性。在你这个事务单元中存在两个操作,一个是update,一个是select;你前面的update执行成功了,再执行select肯定能够查询到前面update的数据,因为你是在一个单元中。但是另外一个事务(即另一个单元)则不能select到这个update的数据,因为你update的数据还没提交,只在该单元中有效
你这是在同一个事务中进行的操作,虽然没有存入数据库,然是更改和查询的数据是同一条,每次执行完一次后应该关闭连接
事务是隔离不同事务操作对同一数据的读写,你可以了解下事务的四个特性
就像楼上说的,事务的隔离性指的是两个事物之间。在同一事务中不存在隔离
你的update和select是处于同一个事务当中
conn.setAutoCommit(false);你设置了手动提交事务,必须要有跟他配对的commit或者是rollback,否则在这个连接既conn关闭之前,所有格update,insert,delete都是无效的,如果你把上面的conn.setAutoCommit(false);注释掉,效果就是修改了的。
conn.setAutoCommit(false);这句话表示手动提交事务,你的update语句和select语句是在同一个事务中,所以,尽管你把conn.rollback();回滚的这句话注释掉了,update语句和select还是处于同一个事务中,所以update做的修改,select是可以看到update修改后的结果的,你可以这样测试一下,打开你的PLSQL Developer软件工具,在该软件工具中写上如下语句update my_test set NAME='1234' where ID='03';select * from my_test;然后执行,然后你看到的就是查询是修改后的效果,尽管你对这2句话,没有提交也没有回滚。
但是,我们可以接着测试,你可以打开一个新的PLSQL Developer软件窗口,在新窗口中输入select * from my_test;执行该语句的话,查询到的就是update更新前的数据,因为你新打开一个PLSQL Developer软件工具,就意味着这是一个新的连接,即这是一个新的会话,即这是一个新的事务,事务的隔离指的是不同事务之间的隔离,而不是指同一个事务内的隔离,同一个事务内压根不存在隔离的说法
而是她的衣服估计