问答题 JDBC处理事务采用什么方法
【正确答案】
【答案解析】一个事务是由一条或多条对数据库操作的SQL语句所组成的一个不可分割的工作单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。在JDBC中,一般是通过commit()方法或rollback()方法来结束事务的操作。其中commit()方法表示完成对事务的提交,rollback()方法表示完成事务回滚,多用于在处理事务的过程中出现了异常的情况,这两种方法都位于java.sql.Connection类中。一般而言,事务默认操作是自动提交,即操作成功后,系统将自动调用commit()方法,否则将调用rollback()方法。
当然,在JDBC中,也可以通过调用setAutoCommit(false)方法来禁止自动提交,然后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()方法实现整体提交,如果其中一个表达式操作失败,就会抛出异常而不会调用commit()方法。在这种情况下,就可以在异常捕获的代码块中调用rollback()方法进行事务回滚。通过此种方法可以保持对数据库的多次操作后,数据仍然保持一致性。
引申:JDBC有哪些事务隔离级别?
为了解决与“多个线程请求相同数据”相关的问题,事务之间通常会用锁相互隔离开。如今,大多数主流的数据库支持不同类型的锁。因此,JDBC APl支持不同类型的事务,它们由Connection对象指派或确定。在JDBC中,定义了以下5种事务隔离级别:
1)TRANSACTION_NONE JDB。不支持事务。
2)TRANSACTTON_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再次查询,发现查询到前次不存在的记录,或者前次的某个记录不见了。)
事务隔离级别越高,为避免冲突所花的精力也就越多。可以通过Connection对象的conn.setTransactionLevel()方法来设置隔离级别,通过conn.getTransactionIsolation()方法来确定当前事务的级别。