Index: backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java
===================================================================
--- backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -7,7 +7,13 @@
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDate;
+import java.util.Collection;
+
 @Repository
 public interface TrainingSessionRepository extends JpaRepository<TrainingSession, Long> {
     Page<TrainingSession> findByTrainingUser_UserIdOrderByDateDesc(Long userId, Pageable pageable);
     java.util.List<TrainingSession> findByTrainingUser_UserIdAndDate(Long userId, java.time.LocalDate date);
+
+    @SuppressWarnings("unused")
+    java.util.List<TrainingSession> findByTrainingUser_UserIdAndDateIn(Long userId, Collection<LocalDate> dates);
 }
Index: backend/src/main/java/com/trekr/backend/service/AuthService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/AuthService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/AuthService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -43,4 +43,5 @@
     }
 
+    @Transactional(readOnly = true)
     public AuthResponse login(LoginRequest request) {
         String usernameOrEmail = request.getUsernameOrEmail().trim();
Index: backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/CustomTrackingService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -36,4 +36,5 @@
     }
 
+    @Transactional(readOnly = true)
     public CustomTrackingCategoriesResponse getCustomTrackingCategories(Long userId) {
         List<CustomTrackingCategoryDto> items = customTrackingCategoryRepository
@@ -72,4 +73,5 @@
     }
 
+    @Transactional(readOnly = true)
     public TasksResponse getCustomCategoryTasks(Long userId, Long customTrackingId) {
         requireOwnership(userId, customTrackingId);
Index: backend/src/main/java/com/trekr/backend/service/DisciplineService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/DisciplineService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/DisciplineService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -71,4 +71,5 @@
     }
 
+    @Transactional(readOnly = true)
     public TasksResponse getTasks(Long userId, int page, int size) {
         if (!disciplineUserRepository.existsById(userId)) {
@@ -162,5 +163,4 @@
      * Computes the daily completion percentage for the given date:
      * finished_tasks / total_tasks * 100
-     *
      * - Persisted once per user+date. If already computed, it is not re-computed.
      * - After computing, all tasks for that user are reset to unfinished.
@@ -210,12 +210,15 @@
         // (not strictly required for now, but matches schema and enables future analytics)
         if (finished > 0) {
-            List<Task> finishedTasks = taskRepository.findByDisciplineUser_UserIdAndFinishedTrue(userId);
-            for (Task t : finishedTasks) {
-                TaskDailyCompletion link = new TaskDailyCompletion();
-                link.setTask(t);
-                link.setDailyCompletion(savedCompletion);
-                link.setId(new TaskDailyCompletionId(t.getTaskId(), savedCompletion.getDailyCompletionId()));
-                taskDailyCompletionRepository.save(link);
-            }
+            List<TaskDailyCompletion> links = taskRepository.findByDisciplineUser_UserIdAndFinishedTrue(userId)
+                    .stream()
+                    .map(t -> {
+                        TaskDailyCompletion link = new TaskDailyCompletion();
+                        link.setTask(t);
+                        link.setDailyCompletion(savedCompletion);
+                        link.setId(new TaskDailyCompletionId(t.getTaskId(), savedCompletion.getDailyCompletionId()));
+                        return link;
+                    })
+                    .toList();
+            taskDailyCompletionRepository.saveAll(links);
         }
 
@@ -228,4 +231,5 @@
     }
 
+    @Transactional(readOnly = true)
     public DailyCompletionsResponse getDailyCompletions(Long userId, int page, int size) {
         if (!disciplineUserRepository.existsById(userId)) {
Index: backend/src/main/java/com/trekr/backend/service/FinanceService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/FinanceService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/FinanceService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -69,4 +69,5 @@
     }
 
+    @Transactional(readOnly = true)
     public FinanceProfileResponse getProfile(Long userId) {
         FinanceUser financeUser = financeUserRepository.findById(userId)
@@ -81,4 +82,5 @@
     }
 
+    @Transactional(readOnly = true)
     public IncomesResponse getIncomes(Long userId, int page, int size) {
         if (!financeUserRepository.existsById(userId)) {
Index: backend/src/main/java/com/trekr/backend/service/InvestingService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/InvestingService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/InvestingService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -53,4 +53,5 @@
     }
 
+    @Transactional(readOnly = true)
     public InvestingAssetsResponse getAssets(Long userId, int page, int size) {
         if (!investorUserRepository.existsById(userId)) {
Index: backend/src/main/java/com/trekr/backend/service/TrainingService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/TrainingService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/TrainingService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -21,4 +21,5 @@
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
@@ -108,4 +109,5 @@
     }
 
+    @Transactional(readOnly = true)
     public TrainingSessionsResponse getSessions(Long userId, int page, int size) {
         if (!trainingUserRepository.existsById(userId)) {
@@ -134,4 +136,5 @@
     }
 
+    @Transactional(readOnly = true)
     public TrainingProfileResponse getProfile(Long userId) {
         TrainingUser trainingUser = trainingUserRepository.findById(userId)
@@ -202,7 +205,6 @@
 
         String normalized = type.replace('_', '-');
-        return List.of(normalized.split("-"))
-                .stream()
-                .filter(part -> part != null && !part.isBlank())
+        return Arrays.stream(normalized.split("-"))
+                .filter(part -> !part.isBlank())
                 .map(part -> Character.toUpperCase(part.charAt(0)) + part.substring(1))
                 .collect(Collectors.joining(" "));
Index: backend/src/main/java/com/trekr/backend/service/WeightService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/WeightService.java	(revision e9a0543bbb622a2b343d1f5fe3b2df7ddb6a0bd3)
+++ backend/src/main/java/com/trekr/backend/service/WeightService.java	(revision 42da64dc0d28f9380336816f6fb82c7572d0021d)
@@ -21,5 +21,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
@@ -73,4 +75,5 @@
     }
 
+    @Transactional(readOnly = true)
     public WeightProfileResponse getProfile(Long userId) {
         WeightUser weightUser = weightUserRepository.findById(userId)
@@ -84,4 +87,5 @@
     }
 
+    @Transactional(readOnly = true)
     public WeightDailyIntakesResponse getDailyIntakes(Long userId, int page, int size) {
         if (!weightUserRepository.existsById(userId)) {
@@ -92,14 +96,26 @@
                 .findByWeightUser_UserIdOrderByDateDesc(userId, PageRequest.of(page, size));
 
+        List<LocalDate> dates = result.getContent().stream()
+                .map(DailyIntake::getDate)
+                .distinct()
+                .toList();
+
+        Map<LocalDate, Integer> trainingCountsByDate = new HashMap<>();
+        Map<LocalDate, BigDecimal> burnedCaloriesByDate = new HashMap<>();
+        if (!dates.isEmpty()) {
+            trainingSessionRepository.findByTrainingUser_UserIdAndDateIn(userId, dates).forEach(session -> {
+                LocalDate sessionDate = session.getDate();
+                trainingCountsByDate.merge(sessionDate, 1, Integer::sum);
+                BigDecimal calories = session.getCalories() != null ? session.getCalories() : BigDecimal.ZERO;
+                burnedCaloriesByDate.merge(sessionDate, calories, BigDecimal::add);
+            });
+        }
+
         List<WeightDailyIntakeDto> intakes = result.getContent().stream()
                 .map(d -> {
-                    // Fetch training data for this date
-                    var trainingSessions = trainingSessionRepository.findByTrainingUser_UserIdAndDate(userId, d.getDate());
-                    boolean trainedThatDay = !trainingSessions.isEmpty();
-                    BigDecimal burnedCalories = trainingSessions.stream()
-                            .map(ts -> ts.getCalories() != null ? ts.getCalories() : BigDecimal.ZERO)
-                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                    boolean trainedThatDay = trainingCountsByDate.getOrDefault(d.getDate(), 0) > 0;
+                    BigDecimal burnedCalories = burnedCaloriesByDate.getOrDefault(d.getDate(), BigDecimal.ZERO)
                             .setScale(2, java.math.RoundingMode.HALF_UP);
-                    
+
                     return new WeightDailyIntakeDto(
                             d.getDailyIntakeId(),
@@ -143,5 +159,4 @@
     }
 
-    @Transactional
     public WeightProfileResponse updateProfile(Long userId, WeightStartRequest request) {
         WeightUser weightUser = weightUserRepository.findById(userId)
@@ -163,4 +178,5 @@
     }
 
+    @Transactional(readOnly = true)
     public TodayTrainingInfoDto getTodayTrainingInfo(Long userId) {
         // Try to get training user, if doesn't exist just return zeros
