【问题标题】:mybatis, sqlserver, java -- does the isolation level apply across sessions?mybatis、sqlserver、java——隔离级别是否适用于会话?
【发布时间】:2014-02-10 01:54:16
【问题描述】:

假设我有一个用isolation.SERIALIZABLE注解的方法;这段代码在我集群的不同节点上调用。隔离级别是否仅适用于单个会话?还是它实际上会影响所有客户?我的猜测是它跨会话(节点)运行,但希望获得一些反馈。

对问题陈述的补充(作为上下文): 假设该方法使用isolation.SERIALIZABLE 注释并执行以下操作:

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

通常我在存储过程中做这些事情,但这是在 java 代码中发生的。我担心的是机器 M1 上的数据库连接不会知道机器 M2 获取的数据库连接会导致并发问题。我不确定我们的连接池是否跨机器——即使是 M1 和 M2 也可以使用不同的连接,不是吗?

【问题讨论】:

    标签: java sql-server-2008 mybatis isolation-level


    【解决方案1】:

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

    会话与调用应用相关联。

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

    SERIALIZABLE 是最安全的,但也是最多阻塞的。

    【讨论】:

    • 但是如果隔离级别被注释在方法上...意味着一个方法是可序列化的,而另一种方法是其他方法...那么这在连接级别是如何发生的?
    【解决方案2】:

    隔离级别是事务的属性。所以它只影响它设置的事务。

    其他事务在做什么或它们使用何种隔离级别都无关紧要。 SERIALIZABLE 隔离级别的语义为数据可见性提供了一些保证,而与其他事务无关。 其他事务有一些影响,但它是非功能性的,取决于实现 SERIALIZABLE 事务可能会在有并发事务时有性能损失。

    如果您使用 Spring 声明式事务管理,我将解释在连接级别会发生什么。 假设你有方法:

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

    当执行到达此方法时,spring 将创建新事务。首先,它从连接池或数据源获得新连接。然后 spring 为这个事务设置隔离级别。

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2013-05-03
      • 2015-08-02
      相关资源
      最近更新 更多