我使用DB2数据库(9.5)在WebSphere应用程序服务器(7.0.0.19)上运行了一个应用程序.我的印象是应用程序服务器或数据库忽略了在应用程序中设置的隔离级别(在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节描述了应用服务器仍然允许应用程序更改隔离级别的情况,即使连接是可共享的.基本上这适用于将连接配置为可共享但在实际上不共享连接的情况(因为不需要在多个组件之间共享连接).
信息中心中的数据访问API扩展主题表明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).