在spring中使用WebSphere和DB2覆盖事务隔离的最佳方法
大家好,
似乎WebSphere不允许Spring以编程方式覆盖在server.xml (在WebSphere数据源中)中配置的事务隔离级别。那么,当在这种情况下需要覆盖事务隔离时,最好的选择是什么?
假设默认情况下隔离级别设置为REPITABLE_READ,有一个方法...一个巨大的方法,在最后有许多选择和耦合的更新。让我们假设无论如何都没有办法重构这个方法,但是我们知道在这个方法中间的某个地方有一些可以在RR隔离之外使用的selects,因为它们很大,有很多连接,当我们运行这些selects时,我们正在为其他事务锁定数据库中的行。问题是,将它们提取到由@Transactional(isolation=READ_COMMITED)注释的单独方法中不会改变这种情况,因为这种隔离会被WebSphere或数据库驱动程序忽略。
那么,是否可以将连接从Hibernate会话中取出,并在所需的位置(围绕这两个方法)将隔离级别更改为READ_COMMITED,然后在方法结束时将其返回给REPITABLE_READ?我假设每个线程都使用连接,那么更改连接的隔离级别应该不会有任何副作用?
或者,更好的做法是向READ_COMMITED添加一个具有特意配置的隔离级别的专用WebSphere数据源,并创建一个带有注释的方面,从而允许用数据源替换这两种方法?
另外,如果有人能解释一下隔离覆盖机制是如何在@Transaction级别工作的,以及Spring +数据库交互中可能有多少个隔离级别,我将非常感激。或者,也许有人对这个答案有很好的联系。
感谢所有人!
发布于 2019-04-03 20:46:26
似乎没有办法改变隔离级别,这是通过@Transactional注解在server.xml中的DataSource上设置的。虽然可以通过方面拦截DAO方法调用,并通过setTransactionIsolation()直接在连接上设置隔离级别,但一旦事务启动,就无法返回隔离,因为不允许在全局事务中运行的可共享连接上设置隔离级别...
因此可能的解决方案-添加具有读提交隔离的单独数据源,并在需要的任何地方使用它。其他解决方案是-在DB2中,可以直接在SELECT语句中指定隔离级别子句: WITH UR,CS,RS,RR
例如:从带CS的城市中选择名称;
https://stackoverflow.com/questions/55345271
复制相似问题