mongo 的文档里说默认隔离策略是 Read Uncommitted ,定义为“在事务提交之前,在事务中所做的数据更改在事务外部是不可见的”,原文是这样的“Until a transaction commits, the data changes made in the transaction are not visible outside the transaction.”,链接是 https://www.mongodb.com/docs/v4.2/core/read-isolation-consistency-recency/
而 spring 中对 Read Uncommitted 的定义是事务间可以互相读到未提交的更改
public enum Isolation {
/**
* A constant indicating that dirty reads, non-repeatable reads and phantom reads
* can occur. This level allows a row changed by one transaction to be read by
* another transaction before any changes in that row have been committed
* (a "dirty read"). If any of the changes are rolled back, the second
* transaction will have retrieved an invalid row.
* @see java.sql.Connection#TRANSACTION_READ_UNCOMMITTED
*/
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
1
Nasei 2022-07-04 21:49:44 +08:00
spring 那个就是关系型数据库隔离级别的定义
mongoDB 和关系型那种不太一样,能不能读到数据和 read concern 有关系,你复制的那段,是它多文档事务的保证 |
2
nothingistrue 2022-07-05 09:34:24 +08:00
关系数据库的事务,跟非关系数据库的事务,不是一套体系,不能一起看待。比如说 Redis 的事务仅仅代表多个命令同时执行,都没回滚的。
Spring 的事务管理体系,是完全基于关系数据库的(它貌似压根没有 ORM 当中 O 层面的事务管理,完全用得是 R 层面的事务管理)。 |
3
dumbbell5kg OP 谢谢大佬们的回复,又涨姿势了
|
4
dumbbell5kg OP @nothingistrue 请教一下是如何知道 “Spring 的事务管理体系,是完全基于关系数据库的” ,我找了一下 spring 的 java 注释,没有看到类似的提示
|
5
nothingistrue 2022-07-05 16:48:58 +08:00
@dumbbell5kg 没有明确的说明,只是从经验上来说是这样,你可以看看 TransactionManager 的实现类。
|
6
dumbbell5kg OP @nothingistrue 好的 了解了
|