如何使用WebSphere和DB2覆盖Spring中的事务隔离

问题描述 投票:0回答:1

使用WebSphere和DB2在Spring中覆盖事务隔离的最佳方法

大家好,

似乎WebSphere不允许Spring以编程方式覆盖在server.xml(在WebSphere数据源中)中配置的事务隔离级别。那么在这种情况下需要覆盖事务隔离时,最佳选择是什么?

假设默认隔离级别设置为REPITABLE_READ,有一个方法......一个巨大的方法,最后有很多选择和耦合更新。让我们假装无论如何都无法重构这个方法,但是我们知道在这个方法的中间有一些选择可以在RR隔离之外使用,因为它们很大,有很多连接,当我们运行这些选择时,我们锁定数据库中的行以进行其他事务。问题是将它们提取到由@Transactional(隔离= READ_COMMITED)注释的单独方法中不会改变情况,因为WebSphere或数据库驱动程序忽略了这种隔离。

那么,是否可以将Connection从Hibernate Session中取出并将隔离级别更改为READ_COMMITED正好在所需位置(围绕这两种方法)并在方法完成时将其返回到REPITABLE_READ?我假设每个线程使用Connection,并且不应该有任何副作用改变连接上的隔离级别?

或者,是否更好地将具有特定配置隔离级别的专用WebSphere数据源添加到READ_COMMITED并创建带注释的方面,以允许将数据源替换为这两种方法?

另外,如果有人可以解释在@Transaction级别上隔离覆盖机制是如何工作的以及Spring + Database交互中可能有多少隔离级别,那真的很感激吗?或者也许有人与这个答案有很好的联系。

谢谢大家!

hibernate db2 aop spring-transactions websphere-8
1个回答
0
投票

似乎没有办法通过@Transactional注释来更改在server.xml中的DataSource上设置的隔离级别。虽然可以通过方面拦截DAO方法调用并通过setTransactionIsolation()直接在连接上设置隔离级别,但是一旦启动事务,就无法返回隔离,因为尝试在可共享连接上设置隔离级别不允许在全局事务中运行...

所以可能的解决方案 - 使用读提交隔离添加单独的数据源,并在需要的地方使用它。其他解决方案是 - 在DB2中,可以直接在SELECT语句中指定隔离级别子句:WITH UR,CS,RS,RR

例如:SELECT FROM FROM FROM WITH CS;

© www.soinside.com 2019 - 2024. All rights reserved.