事物隔离级别用户指定事务中对数据的操作对其他事物的“可见性”。不同的事物隔离级别能够解决并发访问数据带来的不同的并发问题,而且会直接影响并发效率。数据并发可能会出现一下几种问题:
脏读:这种情况发生在事务中允许读取未提交的数据。例如,A事物修改了一条数据,但是未提交修改,此时A事物对数据的修改其他事物是可见的,B事物中能够读取A事物未提交的修改。一旦A事物回滚,B事物中读取就是不正确的数据。
不可重复读:这种情况发生在如下场景:
1)A事物中读取一行数据。
2)B事务中修改了改行数据。
3)A事物中再次读取该行数据将得到不同的结果。
幻读:种种情况发生在如下场景:
1)A事物通过WHERE条件读取若干行。
2)B事务中插入了符合条件的若干条数据。
3)A事务中通过相同的条件再次读取数据时将会读取到B事物中插入的数据。
JDBC遵顼SQL:2003规范,定义了4种事物隔离级别,另外增加了一种TRANSACTION_NONE,表示不支持事物,这几种事物隔离级别如下。
TRANSCATION_NONE:表示驱动不支持事物,这意味着他是不兼容JDBC规范的驱动程序。
TRANSCATION_READ_UNCOMMITTED:允许读取未提交更改的数据,这意味着可能出现脏读、不可重复读、幻读等现象。
TRANSCATION_READ_COMMITTED:表示在事务中进行的任何数据更改,在提交之前对其他认识是不可见的。这样可以防止脏读,但是不能解决不可重复读和幻读问题。
TRANSCATION_REPEATABLE_READ:该事物隔离级别能够解决脏读和不可重复读问题,但是不能解决幻读问题。
TRANSCATION_SERIALIZABLE:该事务隔离级别下,所有事物串行执行,能够有效解决脏读,不可重复读和幻读问题,但是并发效率低。
Connection对象的默认事物级别由JDBC驱动程序指定。通常它是底层数据源支持的默认事物隔离级别。Connection接口中提供了一个setTransactionIoslation()方法,允许JDBC客户端设置Connection对象的事物隔离级别,新设置的事物隔离级别会在之后的会话中生效。在一个事物中调用setTransactionIsolation()方法是否对当前事物有效取决于具体的驱动实现。JDBC规范建议在调用setTransactionIsolation()方法后,下一个新的事物开始生效。另外,JDBC驱动可能不完全支持除TRANSACTION_NONE之外的4个事物级别。
调用Connection对象的setTransactionIsolation()方法时,如果参数的驱动不支持是事物隔离级别,则驱动程序应该使用更高级别代替该参数级别,如果驱动不支持更高级别,就会抛出SQLExecption异常,可以调用DatabaseMetaData对象supportsTransactionIsolationLevel()方法判断是否支持某一事物隔离级别。
示例图:
事物隔离级别
网友评论