Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序能否更改WebSphere和DB2组合上每个事务的隔离级别_Java_Jakarta Ee_Db2_Websphere_Isolation Level - Fatal编程技术网

Java 应用程序能否更改WebSphere和DB2组合上每个事务的隔离级别

Java 应用程序能否更改WebSphere和DB2组合上每个事务的隔离级别,java,jakarta-ee,db2,websphere,isolation-level,Java,Jakarta Ee,Db2,Websphere,Isolation Level,我有一个应用程序运行在WebSphereApplicationServer(7.0.0.19)上,使用DB2数据库(9.5)。我的印象是,应用服务器或数据库忽略了应用程序中设置的隔离级别(在Java代码中)。应用程序使用从应用程序服务器获取连接,它使用来自应用程序服务器的事务管理器 我没有找到明确的答案(或确认),没有在手册中,也没有在网络上。我发现了一些迹象、建议、暗示,但没有明确的答案。通过对数据库接缝的一些监控来证明这一点 有人能承认这种行为吗? 这可以通过配置来改变吗?因为数据源由应用服

我有一个应用程序运行在WebSphereApplicationServer(7.0.0.19)上,使用DB2数据库(9.5)。我的印象是,应用服务器或数据库忽略了应用程序中设置的隔离级别(在Java代码中)。应用程序使用从应用程序服务器获取连接,它使用来自应用程序服务器的事务管理器

我没有找到明确的答案(或确认),没有在手册中,也没有在网络上。我发现了一些迹象、建议、暗示,但没有明确的答案。通过对数据库接缝的一些监控来证明这一点

有人能承认这种行为吗?
这可以通过配置来改变吗?

因为数据源由应用服务器管理(而WebSphere是Java EE的一个全功能实现),所以实际上这里应用的是JCA规范。JCA 1.5的第7.9节对应用程序更改事务隔离级别的能力施加了以下限制:

如果连接被标记为可共享,则无论是否使用单个共享连接,该连接都必须对应用程序透明。应用程序不得假设正在使用单个共享连接,因此必须以可共享的方式使用该连接

但是,打算以不可共享的方式使用连接的J2EE应用程序组件必须为此留下部署提示,这将阻止容器共享连接。连接的不可分区使用示例包括更改安全属性、隔离级别、字符设置和本地化配置

总而言之:一般来说,如果资源引用将连接配置为可共享,则应用程序不应尝试更改隔离级别。如果查看WAS信息中心中的“设置数据访问隔离级别的要求”主题,您还会发现以下语句:

不允许通过setTransactionIsolation()方法在全局事务中运行的可共享连接上直接设置隔离级别。要在连接上使用不同的隔离级别,必须提供不同的资源引用

另一方面,JCA1.5规范的第7.9.1节描述了应用程序服务器可能仍然允许应用程序更改隔离级别的场景,即使连接是可共享的。基本上,这适用于连接配置为可共享,但实际上没有共享的场景(因为不需要在多个组件之间共享连接)

信息中心中的数据访问API扩展主题建议WebSphere支持以下内容:

如果存在可共享连接的其他句柄,则应用程序[…]在发出连接请求后无法修改该连接的属性。(如果没有其他句柄与连接关联,则可以更改连接属性。)

因此,您应该能够使用setTransactionIsolation()在特定场景中更改隔离级别,但这取决于应用程序如何使用连接

最后,您没有详细描述如何在数据库级别上监控,但是您需要考虑到,在某个时候,应用服务器需要重置物理连接上的隔离级别。因此,如果setTransactionInitiation()成功,则更改可能仅在物理连接上的短时间内生效

请注意,有几种方法可以避免所有这些并发症(可能适用于您的情况,也可能不适用于您的情况):

  • 不要使用setTransactionIsolation(),而是在资源引用上配置适当的隔离级别,必要时使用多个资源引用
  • 在获取连接之前,使用特定于WebSphere的WSDataSource API指定预期的隔离级别
  • 修改SQL以更改每个查询的隔离级别(例如,将
    与UR
    一起使用)
这是相关的

ejb事务和隔离级别的讨论也适用


安德烈亚斯,我的问题基于您在这里总结的相同信息,谢谢您的分享。我想这说明了这个问题。