IBM® Developer Kit for Java™ JDBC API 中有五个级别的事务隔离。从最不严格到最严格列出,它们如下:
JDBC_TRANSACTION_NONE
这是一个特殊常量,表示 JDBC 驱动程序不支持事务。
JDBC_TRANSACTION_READ_UNCOMMITTED
此级别允许事务查看对数据的未提交更改。在这个级别上,所有数据库异常都是可能的。
JDBC_TRANSACTION_READ_COMMITTED
此级别意味着在事务提交之前,事务内部所做的任何更改在事务外部都不可见。这可以防止脏读成为可能。
JDBC_TRANSACTION_REPEATABLE_READ
此级别意味着读取的行保留锁,以便在事务未完成时另一个事务无法更改它们。这不允许脏读和不可重复读。幻读仍然是可能的。
JDBC_TRANSACTION_SERIALIZABLE
表为事务锁定,因此 WHERE 条件不能被其他向表添加值或从表中删除值的事务更改。这可以防止所有类型的数据库异常。
setTransactionIsolation 方法可用于更改连接的事务隔离级别。
一个常见的误解是 JDBC 规范定义了前面提到的五个事务级别。通常认为 TRANSACTION_NONE 值代表了在没有承诺控制的情况下运行的概念。JDBC 规范没有以同样的方式定义 TRANSACTION_NONE。TRANSACTION_NONE 在 JDBC 规范中定义为驱动程序不支持事务并且不是 JDBC 兼容驱动程序的级别。调用 getTransactionIsolation 方法时从不报告 NONE 级别。
由于 JDBC 驱动程序的默认事务隔离级别是由实现定义的,这个问题稍微复杂了一点。本机 JDBC 驱动程序默认事务隔离级别的默认事务隔离级别为 NONE。这允许驱动程序使用没有日志的文件,并且您不需要制定任何规范,例如 QGPL 库中的文件。
本机 JDBC 驱动程序允许您将 JDBC_TRANSACTION_NONE 传递给 setTransactionIsolation 方法或指定 none 作为连接属性。但是,当值为 none 时,getTransactionIsolation 方法总是报告 JDBC_TRANSACTION_READ_UNCOMMITTED。如果这是您的应用程序的要求,那么您的应用程序有责任跟踪您正在运行的级别。
在过去的版本中,JDBC 驱动程序将通过将事务隔离级别更改为 none 来处理您为自动提交指定 true,因为系统没有真正的自动提交模式的概念。这是功能的近似值,但并未为所有场景提供正确的结果。不再这样做了;数据库将自动提交的概念与事务隔离级别的概念分离。因此,在 JDBC_TRANSACTION_SERIALIZABLE 级别运行并启用自动提交是完全有效的。唯一无效的场景是在 JDBC_TRANSACTION_NONE 级别运行,而不是处于自动提交模式。当系统未以事务隔离级别运行时,您的应用程序无法控制提交边界。
IBM i平台的事务隔离级别的通用名称与 JDBC 规范提供的名称不匹配。下表与IBM i平台使用的名称匹配,但不等同于 JDBC 规范使用的名称:
JDBC 级别* | IBM i级 |
---|---|
JDBC_TRANSACTION_NONE | *无或*NC |
JDBC_TRANSACTION_READ_UNCOMMITTED | *CHG 或 *UR |
JDBC_TRANSACTION_READ_COMMITTED | *CS |
JDBC_TRANSACTION_REPEATABLE_READ | *ALL 或 *RS |
JDBC_TRANSACTION_SERIALIZABLE | *RR |
* 在此表中,为清楚起见,JDBC_TRANSACTION_NONE 值与IBM i级别 *NONE 和 *NC 对齐。这不是规范与IBM i级别的直接匹配。如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下极悦的JDBC视频教程,里面有更丰富的知识等着大家去学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习