kaiyun官方网站 详解 Seata AT 方法事务阻隔级别与全局锁操办

栏目分类kaiyun官方网站 详解 Seata AT 方法事务阻隔级别与全局锁操办

你的位置:kaiyuan体育 > 新闻中心 >

kaiyun官方网站 详解 Seata AT 方法事务阻隔级别与全局锁操办

发布日期:2023-12-09 13:37    点击次数:67

kaiyun官方网站 详解 Seata AT 方法事务阻隔级别与全局锁操办

[[442164]]

Seata AT 方法是一种非侵入式的分散式事务处理决策,Seata 在里面作念了对数据库操作的代理层,咱们使用 Seata AT 方法时,本色上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了好多逻辑,比如插入回滚 undo_log 日记,查验全局锁等。

为什么要查验全局锁呢,这是由于 Seata AT 方法的事务阻隔是确立在支事务的土产货阻隔级别基础之上的,在数据库土产货阻隔级别读已提交或以上的前提下,Seata 操办了由事务协作器调养的全局写排他锁,来保证事务间的写阻隔,同期,将全局事务默许界说在读未提交的阻隔级别上。

Seata 事务阻隔级别解读

在讲 Seata 事务阻隔级之前,咱们先来回首一下数据库事务的阻隔级别,现在数据库事务的阻隔级别一共有 4 种,由低到高离别为:

Read uncommitted:读未提交 Read committed:读已提交 Repeatable read:可叠加读 Serializable:序列化

数据库一般默许的阻隔级别为读已提交,比如 Oracle,也有一些数据的默许阻隔级别为可叠加读,比如 Mysql,一般而言,数据库的读已提交约略得志业务绝大部分场景了。

咱们知说念 Seata 的事务是一个全局事务,它包含了多少个分支土产货事务,在全局事求施行经过中(全局事务还没施行完),某个土产货事务提交了,如若 Seata 莫得摄取任务法子,则会导致已提交的土产货事务被读取,形成脏读,如若数据在全局事务提交前已提交的土产货事务被修改,则会形成脏写。

由此不错看出,传统意旨的脏读是读到了未提交的数据,Seata 脏读是读到了全局事务下未提交的数据,全局事务可能包含多个土产货事务,某个土产货事务提交了不代表全局事务提交了。

在绝大部分期骗在读已提交的阻隔级别下职责是莫得问题的,而本色上,这当中又有绝大多半的期骗场景,本色上职责在读未提交的阻隔级别下雷同莫得问题。

在极点场景下,期骗如若需要达到全局的读已提交,Seata 也提供了全局锁机制已毕全局事务读已提交。关联词默许情况下,Seata 的全局事务是职责在读未提交阻隔级别的,保证绝大多半场景的高效性。

全局锁已毕

AT 方法下,会使用 Seata 里面数据源代理 DataSourceProxy,全局锁的已毕即是阴私在这个代理中。咱们离别在施行、提交的经过齐作念了什么。

1、施行经过

施行经过在 StatementProxy 类,在施行经过中,如若施行 SQL 是 select for update,则会使用 SelectForUpdateExecutor 类,如若施行圭臬中带有 @GlobalTransactional or @GlobalLock注解,则会查验是否有全局锁,如若现时存在全局锁kaiyun官方网站,则会回滚土产货事务,通过 while 轮回不断地再行竞争得到土产货锁和全局锁。

public T doExecute(Object... args) throws Throwable {     Connection conn = statementProxy.getConnection();     // ... ...     try {         // ... ...         while (true) {             try {                 // ... ...                 if (RootContext.inGlobalTransaction()