问题一:Seata中假如saga模式有3个本地事务,这里线程2才能查到本地事务A的执行结果?
Seata中假如saga模式有3个本地事务,本地事务A->本地事务B->本地事务C,线程1把本地事务A执行完成以后,线程2此时能立刻查到本地事务A的执行结果么,还是说得线程1把本地事务A->本地事务B->本地事务C都执行完以后,线程2才能查到本地事务A的执行结果?
参考答案:
线程2此时能立刻查到本地事务A的执行结果,at是读未提交隔离级别。saga 可以立即查到,saga 不能保证隔离性。at默认是读未提交隔离级别,可能会产生脏读,如果不想要脏读,可以考虑加锁;
saga的各本地事务是独立的,不保证隔离性,saga那种不能叫脏读,本来设计就是这样,各本地事务提交了就算真的提交了。
关于本问题的更多回答可点击进行查看:
https://developer.aliyun.com/ask/577885?spm=a2c6h.12873639.article-detail.22.456d4378DrHxEF
问题二:seata中之前可以在docker官网登录,并搜索镜像版本,怎么现在不能访问了?
seata中之前可以在docker官网登录,并搜索镜像版本,怎么现在不能访问了?
参考答案:
这可能涉及到网络问题或其他因素。如果您只是想拉取镜像,可以通过设置中科大、阿里等国内镜像仓库来解决
关于本问题的更多回答可点击进行查看:
https://developer.aliyun.com/ask/576788?spm=a2c6h.12873639.article-detail.24.456d4378DrHxEF
问题三:Seata中jvm 是基于栈式的虚拟机 为什么还会有指令重排序?
Seata中jvm 是基于栈式的虚拟机 为什么还会有指令重排序?
参考答案:
在Java中,Seata的运行环境是基于JVM(Java虚拟机)的,而JVM通常实现了一种名为JIT(Just-In-Time)编译器的技术。虽然JVM本身使用的是栈式虚拟机模型来执行字节码,但是JIT编译器会将热点代码(频繁执行的代码)编译成本地机器码以提高性能。
在这个过程中,为了优化程序的执行效率和资源利用,编译器和处理器(CPU)可能会对指令进行重排序。这是因为,根据计算机体系结构和处理器设计,有些指令之间的执行顺序并不影响最终结果,只要它们之间没有数据依赖性。通过重新安排这些指令的执行顺序,可以更好地利用处理器的并行处理能力,比如多核处理器、流水线等硬件特性,从而提升程序的执行速度。
因此,即使是在基于栈式的虚拟机环境中,如JVM,也有可能发生指令重排序的情况,特别是在JIT编译器将字节码转换为本地机器码的过程中。需要注意的是,这种优化只会在不改变程序语义的前提下进行,即保证单线程下的程序执行结果与原始代码一致。对于多线程编程来说,指令重排序可能导致并发问题,因此需要通过内存模型和同步机制来保证数据的一致性。
关于本问题的更多回答可点击进行查看:
https://developer.aliyun.com/ask/575546?spm=a2c6h.12873639.article-detail.25.456d4378DrHxEF
问题四:Seata中在大批频繁操作相同对象时,记录的Select SQL出现 For Update怎么解决?
"Seata中在大批量频繁操作相同对象时,记录的Select SQL出现 For Update。
环境:Mysql 隔离级别(READ-COMMITTED)阿里云, Spring Boot , Seata 1.7.0
描述:两个微服务程序批处理读、写表时。 程序未对 SQL 进行 For Update;
但是阿里云以及(SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;)都出现Select语句 锁等待。 这个问题有遇到过吗?我用的是 @GlobalTransactional,没有用GlobalLocks。我本地跟了一下代码 只有 识别到 程序加的For UPDATE才会走 SelectForUpdateExecutor 。"
参考答案:
AT依赖于for update,我理解这个场景的核心是热点数据竞争问题,根本不在for update。update的时候,seata会替你发一条select for update,建议去看官网原理。 for update阻塞只是表象,不是去解决for update的问题,而是共享数据高并发更新的问题。如果你要解决掉for update,就没有全局事物。
关于本问题的更多回答可点击进行查看:
https://developer.aliyun.com/ask/575545?spm=a2c6h.12873639.article-detail.26.456d4378DrHxEF