gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:51 25 4
gpt4 key购买 nike

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

我没有找到明确的答案(或确认),手册中没有,网络上也没有。我找到了一些迹象、建议、影射,但没有明确的答案。对数据库接缝的一些监控可以证明这一点。

有人可以承认这种行为吗?这可以使用配置更改吗?

最佳答案

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

If a connection is marked as shareable, it must be transparent to the application whether a single shared connection is used or not. The application must not make assumptions about a single shared connection being used, and hence must use the connection in a shareable manner.

However, a J2EE application component that intends to use a connection in an unshareable way must leave a deployment hint to that effect, which will prevent the connection from being shared by the container. Examples of unshareable usage of a connection include changing the security attributes, isolation levels, character settings, and localization configuration.

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

Trying to directly set the isolation level through the setTransactionIsolation() method on a shareable connection that runs in a global transaction is not allowed. To use a different isolation level on connections, you must provide a different resource reference.

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

信息中心的Extensions to data access APIs 主题表明 WebSphere 支持这个:

applications [...] cannot modify the properties of a shareable connection after making the connection request, if other handles exist for that connection. (If no other handles are associated with the connection, then the connection properties can be altered.)

因此,您应该能够在特定情况下使用 setTransactionIsolation() 来更改隔离级别,但这取决于您的应用程序如何使用连接。

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

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

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

关于java - 应用程序能否更改 WebSphere 和 DB2 组合上每个单独事务的隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com