JDBC 相关知识(四)
lgl669
2009-06-15
四、JDBC中的事务
Transaction:事物,一组相关的操作组合为一个整体,要么同时成功,要么同时失败。 ACID四大属性:autimicity:原子性;consistensy:一致性;isolation:隔离性;durability:持久性。 事务的提交方式分为: 自动式:jdbc新建连接默认使用此方式; 手动式:Connection.setAutoCommit(false),Connection.commit(),Connection.rollback() dirty read(脏读):一个事务读取了其他事务未提交的数据。 repeatable read(不可重复读):在同一事务内多次读取同一数据的内容不一致。关注的是内容; 31 J2EE @ zxw phantom read(幻影读/虚读):在同一事务中多次读取数据库记录的个数不一致。关注的是个数; ------------------------------------------------------------------------------------------------------------------------ 为防止以上问题的出现,在JDBC中提供了五种隔离级别: 下面的常量在java.sql.Connection中: 0:TRANSACTION_NONE 不支持事务 1:TRANSACTION_READ_UNCOMMITTED 可以读取其他事务未提交的数据,可能产生脏读, 不可重复读,幻影读的问题; 2:TRANSACTION_READ_COMMITTED 只能读取别的事务提交了的数据,解决脏读问题, 但仍能产生不可重复读和幻影读问题 4:TRANSACTION_REPEATABLE_READ 可以解决脏读,不可重复读问题,但仍可能产生幻影读的问题 8:TRANSACTION_SERIALIABLE 解决了脏读,不可重复读,幻影读的问题 级别设置越高,消耗资源就越高; ------------------------------------------------------------------------------------------------------------------------ 脏读:B事务读到了A事务没有提交的数据 时间 A事务 B事务 ----------------- t1 启动 t2 启动 t3 update t4 select t5 rollback t6 结束 不可重复读:B事务两次查询同一条记录的内容不一样 时间 A事务 B事务 ----------------- t1 启动 t2 启动 t3 select t4 update t5 commit t6 结束 幻读:B事务做同一条记录的查询,但结果数量不同 时间 A事务 B事务 ----------------- 32 J2EE @ zxw t1 启动 t2 启动 t3 select t4 insert t5 commit t6 select t7 commit ------------------------------------------------------------------------------------------------------------------------ 设置隔离级别的方法:Connection.setTransactionIsolation(隔离级别对应的常量)。 read uncommited read commited repeatable serializable dirty read n y y y repeatable read n n y y phandom read n n n y oracle 默认的隔离级别是:read commited. oracle只支持标准的隔离级别中的两种:read commited和serializable. |