专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 告诉你JDBC事务隔离级别有哪些

告诉你JDBC事务隔离级别有哪些

更新时间:2022-08-22 10:36:04 来源:动力节点 浏览1347次

JDBC 事务隔离级别

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 级别运行,而不是处于自动提交模式。当系统未以事务隔离级别运行时,您的应用程序无法控制提交边界。

JDBC 规范和IBM i平台之间的事务隔离级别

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视频教程,里面有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>