电话

028-126520321

Seata AT 模式是一种非侵入式的分布式事务解决方案。在 Seata AT 模式中,Seata 内部使用数据库操作的代理层。使用 Seata AT 模式时,我们实际上使用的是 Seata 自带的数据源代理 DataSourceProxy。在这一代理层中,Seata 添加了许多逻辑,包括插入回滚日志 undo_log 和检查全局锁等。

标签: 2024-06-30 

为什么要检查全局锁呢?这是因为 Seata AT 模式采用了事务隔离机制,建立在支持本地隔离级别的基础上。在数据库本地隔离级别达到读已提交或更高级别的前提下,Seata 为保证事务间的写隔离,设计了由事务协调器维护的全局写排他锁,同时默认将全局事务定义在读未提交的隔离级别上。

Seata 事务隔离级别详解 BOB半岛APP

\n在介绍 Seata 事务隔离级别之前,我们先回顾一下数据库事务的隔离级别。目前,数据库事务的隔离级别有四种,分别是:

Read uncommitted(读未提交) Read committed(读已提交) Repeatable read(可重复读)

Seata AT 模式是一种非侵入式的分布式事务解决方案。在 Seata AT 模式中,Seata 内部使用数据库操作的代理层。使用 Seata AT 模式时,我们实际上使用的是 Seata 自带的数据源代理 DataSourceProxy。在这一代理层中,Seata 添加了许多逻辑,包括插入回滚日志 undo_log 和检查全局锁等。

Serializable(串行化)

通常情况下,默认的隔离级别是读已提交。例如 Oracle 数据库。但也有一些数据库的默认隔离级别为可重复读,例如 MySql。一般而言,数据库的读已提交已经能够满足绝大多数的业务场景BOB半岛老版本。我们都知道,Seata的事务是一个全局性质的事务,它由多个本地事务所组成。如果在全局事务执行的过程中,在整个全局事务未完成的情况下,某个本地事务已经提交了,若Seata没有采取措施,则可能会导致已经提交的本地事务被读取,从而产生脏读问题。如果在全局事务提交之前,已经提交的本地事务也被修改了,则可能会造成脏写问题。通过上述内容可以得出结论,传统定义的"脏读"是指读取到了还未提交的数据。而在Seata中,"脏读"指的是读取到了在全局事务下尚未提交的数据。全局事务可能包含了多个本地事务,当某个本地事务提交了,并不意味着全局事务也同样提交了BOB半岛入口。大多数应用在读已提交的隔离级别下都没有问题,实际上,在读未提交的隔离级别下也大多数应用场景同样没有问题。在极端情况下,如果应用需要实现全局的读取已提交,Seata还提供了全局锁定机制来实现全局事务的读取已提交。然而,Seata 默认将全局事务设置为读未提交隔离级别,以确保在大多数情况下的高效性。在 AT 模式下实现全局锁,需要使用 Seata 内部的数据源代理 DataSourceProxy。而实现全局锁则是通过这个代理进行隐藏。我们在执行和提交的过程中都完成了哪些工作。1、执行流程:\n在 StatementProxy 类中负责执行流程。在执行过程中,如果执行的 SQL 是 select for update,则会调用 SelectForUpdateExecutor 类进行处理。如果执行的方法上标有 @GlobalTransactional 或者 @GlobalLock 注解,则会检查是否存在全局锁。如果当前存在全局锁,则会回滚本地事务,并通过 while 循环持续竞争获取本地锁和全局锁。public T execute(Object... arguments) throws Throwable {\n Connection connection = statementProxy.getConnection();\n //...\n try {\n //...\n while (true) {\n try {\n //...\n if (RootContext.inGlobalTransaction()) {\n

BOB半岛平台


BOB半岛平台 BOB半岛官方

推荐新闻