diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 2aeffdb..0d324db 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -83,60 +83,64 @@
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
-    /*
-    @TestFactory
-    Collection<DynamicTest> testAddUpLoad() {
-        Random rnd = new Random();
-        String ih = infoHashes.get(0);
-        return userIds.stream()
-            .map(uid -> DynamicTest.dynamicTest("AddUpLoad for user " + uid, () -> {
-                EntityTransaction tx = em.getTransaction();
-                tx.begin();
-                try {
-                    // 获取该用户当前的总上传量
-                    Long currentUserUpload = em.createQuery(
-                        "SELECT COALESCE(u.upload,0) FROM UserPT u WHERE u.userid = :uid", Long.class
-                    ).setParameter("uid", uid).getSingleResult();
-                    
-                    // 获取该用户在该种子上的当前上传量
-                    Long currentSeedUpload = em.createQuery(
-                        "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid AND t.seedid = " +
-                        "(SELECT s.seedId FROM SeedHash s WHERE s.infoHash = :ih)", Long.class
-                    ).setParameter("uid", uid).setParameter("ih", ih).getSingleResult();
-                    
-                    int delta = rnd.nextInt(1000) + 1;
-                    long newSeedTotal = currentSeedUpload + delta;
-                    
-                    Assertions.assertFalse(tracker.AddUpLoad(uid, (int)newSeedTotal, ih),
-                        "AddUpLoad should return false on successful operation");
-                    em.clear();
+    
+//     @TestFactory
+//     Collection<DynamicTest> testAddUpLoad() {
+//     Random rnd = new Random();
+//     String ih = infoHashes.get(0);
+//     return userIds.stream()
+//         .map(uid -> DynamicTest.dynamicTest("AddUpLoad for user " + uid, () -> {
+//             // 1) 获取该用户当前的总上传量
+//             Long currentUserUpload = em.createQuery(
+//                 "SELECT u.upload FROM UserPT u WHERE u.userid = :uid", Long.class)
+//                 .setParameter("uid", uid)
+//                 .getSingleResult();
 
-                    // commit & restart test TX so we see the data that tracker committed
-                    tx.commit();
-                    em.clear();
-                    tx.begin();
+//             // 2) 获取该用户在该种子上的当前上传量
+//             Long currentSeedUpload = em.createQuery(
+//                 "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t " +
+//                 "WHERE t.uploaduserid = :uid AND t.seedid = " +
+//                 "(SELECT s.seedId FROM SeedHash s WHERE s.infoHash = :ih)", Long.class)
+//                 .setParameter("uid", uid)
+//                 .setParameter("ih", ih)
+//                 .getSingleResult();
 
-                    // 验证 UserPT.upload 是否等于 TransRecord 表中该用户的实际总和
-                    Long actualTransRecordSum = em.createQuery(
-                        "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid", Long.class
-                    ).setParameter("uid", uid).getSingleResult();
-                    
-                    Long userPTUpload = em.createQuery(
-                        "SELECT u.upload FROM UserPT u WHERE u.userid = :uid", Long.class
-                    ).setParameter("uid", uid).getSingleResult();
-                    
-                    Assertions.assertEquals(actualTransRecordSum, userPTUpload, 
-                        "UserPT.upload should equal sum of TransRecord.upload for this user");
-                    Assertions.assertEquals(currentUserUpload + delta, userPTUpload.longValue(),
-                        "User total upload should increase by delta");
-                } finally {
-                    tx.rollback();
-                    em.clear();
-                }
-            }))
-            .collect(Collectors.toList());
-    }
-    */
+//             int delta = rnd.nextInt(1000) + 1;
+//             long newSeedTotal = currentSeedUpload + delta;
+
+//             // 调用业务方法（内部自管理事务）
+//             Assertions.assertFalse(
+//                 tracker.AddUpLoad(uid, (int)newSeedTotal, ih),
+//                 "AddUpLoad should return false on successful operation"
+//             );
+//             em.clear();
+
+//             // 验证 TransRecord 表中的实际总和
+//             Long actualTransRecordSum = em.createQuery(
+//                 "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid", Long.class)
+//                 .setParameter("uid", uid)
+//                 .getSingleResult();
+//             // 验证 UserPT.upload
+//             Long userPTUpload = em.createQuery(
+//                 "SELECT u.upload FROM UserPT u WHERE u.userid = :uid", Long.class)
+//                 .setParameter("uid", uid)
+//                 .getSingleResult();
+
+//             Assertions.assertEquals(
+//                 actualTransRecordSum, userPTUpload,
+//                 "UserPT.upload 应等于 TransRecord 中的总和"
+//             );
+//             Assertions.assertEquals(
+//                 currentUserUpload + delta, userPTUpload.longValue(),
+//                 "UserPT.upload 应增加 delta"
+//             );
+
+//             // 恢复原始上传量，避免测试污染
+//             Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta));
+//         }))
+//         .collect(Collectors.toList());
+// }
+    
    
    
     // @TestFactory
