前置
mongodb分片集群想要使用事务,需要对应分片没有仲裁节点
代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
如果是单个mongos
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.stereotype.Component;
/**
* @author kittlen
* @date 2024-04-09 17:20
* @description
*/
@Component
public class MongodbConfig {
@Bean
public MongoTransactionManager transactionManager(MongoDbFactory factory) {
return new MongoTransactionManager(factory);
}
}
使用
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoTransactionManager mongoTransactionManager;
public int dbFunc(){
TransactionTemplate transactionTemplate = new TransactionTemplate(mongoTransactionManager);
return transactionTemplate.execute(status -> {
try {
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, collection1);
long l = updateResult.getUpsertedId() == null ? updateResult.getModifiedCount() : 1;
if (l > 0) {
mongoTemplate.insert(saveEntity, collection2);
}
return 1;
} catch (Exception e) {
// 如果发生异常,事务将在此处回滚,通过status.setRollbackOnly();或者抛出异常都可回滚
status.setRollbackOnly();
return 0;
}
});
}
如果连接是多mongos,则需要重写BaseCluster类
多mongos时使用的是随机获取的方式获取mongosClient,通过记录第一次调用的client使后续事务内的请求都通过同一个client请求,防止出现不同mongos导致事务失败情况
事务记录类
import com.mongodb.connection.Server;
import java.util.function.Supplier;
/**
* @author