Seata的隔离级别问题
Seata的默认的全局隔离级别是读未提交
它通过生成before image时,select语句后加FOR UPDATE 行锁来避免本地事务的并发问题。这里只是存在第一阶段,第一阶段提交之后行锁就会释放。
TC端的全局锁来保证全局事务 一阶段 二阶段之间的隔离性问题
需要注意的是,如果我们使用了全局事务相关的数据表,那么对该数据表的操作都需要有校验全局锁的过程。我们不能在开一个口子让某个接口能直接修改该数据表。如果这样那么就很容易出现全局回滚失败的异常。
我们可以通过使用@GlobalLock
读隔离 @GloblaTransactional
写隔离 来避免脏读和脏写问题。
@GlobalLock
注解的作用是我们在执行sql 本地提交之前,ConnectionProxy对象都会去TC进行查询校验全局锁;
@GloblaTransactional
注解的作用是开启一个全局事务,并把XID一直往下游服务传递,XID会保存在RootContext对象中,在执行sql 本地提交之前,ConnectionProxy对象会去判断RootContext对象中存不存在XID,如果有那么就会去往TC端进行全局锁insert操作。
怎么使用Seata框架,来保证事务的隔离性?
A: 因 seata 一阶段本地事务已提交,为防止其他事务脏读脏写需要加强隔离。
脏读 select 语句加 for update,代