MYBATIS,SQLSERVER,JAVA-隔离水平是否适用于会话



假设我有一种用sillation.serializable注释的方法;并且该代码在我的群集上的不同节点上调用。隔离级别仅适用于一次会话吗?还是实际上影响所有客户?我的猜测是它在会话(节点)中运行,但想获得一些反馈。

添加问题语句(作为上下文):假设该方法通过隔离来注释。可隔离并执行以下操作:

Read from table A
Based on the data read do something then update table B

通常我会在存储的过程中做这些事情,但这在Java代码中发生。我担心的是,机器M1上的DB连接不会意识到机器M2获得的DB连接,从而引起并发问题。我不确定我们的连接池是否跨机器 - 即使是M1,M2可以使用不同的连接,否?

隔离级别与数据库连接关联。

会话与调用应用程序相关联。

因此,如果您的调用应用程序共享池中的连接,并且在池中的连接上设置了隔离,那么只要设置正确设置,您就可以了。

可序列化是最安全的,但阻塞最多。

隔离级别是交易的属性。因此,它仅影响设定的交易。

他们在做什么其他交易或使用哪些隔离水平都没关系。可序列化隔离水平的语义为数据可见性提供了一些保证,无论其他交易如何。其他交易也有一些影响,但非功能性取决于实施序列化交易可能会在同时进行交易时会受到绩效罚款。

如果您使用的是弹簧声明交易管理,我将解释连接级别的情况。假设您有方法:

@Transactional(isolation = SERIALIZABLE)
public void myMethod() {
}

当执行到达此方法时,弹簧将创建新事务。首先,它可以从连接池或DataSource获得新连接。然后,春季设置了此交易的隔离水平。

最新更新