【正确答案】5种。
【答案解析】 为了解决与“多个线程请求相同数据”相关的问题,事务之间通常会用锁相互隔离开。现今,大多数主流的数据库支持不同类型的锁。因此,JDBC API支持不同类型的事务,它们由Connection对象指派或确定。在JDBC中,定义了以下5种事务隔离级别:
1)TRANSACTION NONE JDB:不支持事务。
2)TRANSACTION READ UNCOMMITTED:未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读“脏”数据、不可重复读和“虚读”都是允许的。
3)TRANSACTION READ COMMITTED:已提交读。说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和“虚读”产生。
4)TRANSACTION REPEATABLE READ:可重复读。说明事务保证能够再次读取相同的数据而不会失败,但“虚读”仍然会出现。
5)TRANSACTION SERIALIZABLE:可序列化。它是最高的事务级别,它防止读“脏”数据、不可重复读和“虚读”。
备注:读“脏”数据:一个事务读取了另一个事务尚未提交的数据,例如,当事务A与事务B并发执行时,当事务A更新后,事务B查询读取到事务A尚未提交的数据,此时事务A回滚,则事务B读到的数据是无效的“脏”数据。不可重复读:一个事务的操作导致另一个事务前后两次读取到不同的数据,例如,当事务A与事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次读取该数据,发现前后两次的数据不一样。“虚读”:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如,当事务A与事务B并发执行时,当事务B查询读取数据后,事务A新增或删除了一条满足事务A的查询条件的记录,此时,事务B再次查询,发现查询到前次不存在的记录,或者前次的某个记录不见了。以银行存款为例,A存款100元未提交,这时银行做报表进行统计查询帐户为200元,然后A提交了,这时银行再统计发现帐户为300元,无法判断到底以哪个为准?