假设我有一个用isolation注释的方法.SERIALIZABLE;并且在我的集群上的不同节点上调用这段代码。隔离级别仅适用于单个会话吗?或者它实际上影响了所有客户?我的猜测是它遍及会话(节点),但希望得到一些反馈。
除了问题陈述(作为上下文): 假设该方法使用isolation.SERIALIZABLE注释并执行以下操作:
Read from table A
Based on the data read do something then update table B
通常我会在存储过程中执行这些操作,但这是在java代码中发生的。我担心机器M1上的数据库连接不会知道机器M2获取的数据库连接导致并发问题。我不确定我们的连接池是否跨越机器 - 即使它是M1和M2可以使用不同的连接,不是吗?
答案 0 :(得分:0)
隔离级别与数据库连接相关联。
会话与呼叫应用相关联。
因此,如果您的呼叫应用程序共享来自池的连接,并且在池中的连接上设置了隔离,只要正确设置了该级别,您就可以了。
SERIALIZABLE是最安全但阻挡最多的。
答案 1 :(得分:0)
隔离级别是事务的属性。所以它只影响它设置的事务。
其他事务正在做什么或者它们使用哪种隔离级别并不重要。无论其他事务如何,SERIALIZABLE隔离级别的语义都为数据可见性提供了一些保证。 其他事务会产生一些影响,但它是非功能性的,取决于实现SERIALIZABLE事务在并发事务时可能会有性能损失。
如果您使用的是spring声明式事务管理,我将解释连接级别会发生什么。 假设你有方法:
@Transactional(isolation = SERIALIZABLE)
public void myMethod() {
}
当执行到达此方法时,spring将创建新事务。首先,它从连接池或DataSource获得新连接。然后spring为此事务设置隔离级别。