kindergarten_java/docs/V10_MIGRATION_FIX.md
En 938503f2b8 chore: 更新启动脚本使用 Java (Spring Boot) 后端
- 修改后端目录从 reading-platform-backend 改为 reading-platform-java
- 修改后端端口从 3000 改为 8080
- 修改启动命令从 npm run start:dev 改为 mvn spring-boot:run
- 添加 JAVA_HOME 自动检测和设置(默认使用 /f/Java/jdk-17)
- 修改日志文件从 reading-platform-backend.log 改为 reading-platform-java.log
- 修改健康检查接口为 /actuator/health
- 增加启动等待超时时间到 60 秒(Java 启动较慢)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 10:35:30 +08:00

98 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库写操作失败修复指南
## 问题现象
所有写操作INSERT/UPDATE返回 500 错误:
- 课程创建 API 失败
- 课程更新 API 失败
- 租户创建 API 失败
读操作 API 正常工作。
## 可能原因
1. **Flyway 迁移失败或锁定** - V10 迁移可能失败,导致数据库锁表
2. **数据库连接为只读模式**
3. **数据库用户权限不足**
## 解决方案
### 方案一:清理 Flyway 迁移记录(推荐)
在 MySQL 客户端中执行以下命令:
```sql
-- 1. 查看当前 Flyway 迁移历史
SELECT * FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 10;
-- 2. 检查是否有 V10 失败记录
SELECT * FROM flyway_schema_history WHERE version = '10';
-- 3. 如果 V10 状态为 'FAILED',删除该记录
DELETE FROM flyway_schema_history WHERE version = '10' AND success = 0;
-- 4. 验证清理结果
SELECT * FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;
```
然后**重启后端服务**Flyway 会自动重新执行迁移。
### 方案二:检查数据库连接
```sql
-- 1. 检查当前数据库是否为只读模式
SELECT @@global.read_only;
-- 应该返回 0可读可写如果返回 1 则是只读模式
-- 2. 检查当前用户权限
SHOW GRANTS FOR CURRENT_USER();
-- 确保有 INSERT, UPDATE, DELETE 权限
-- 3. 检查表是否被锁定
SHOW OPEN TABLES WHERE In_use > 0;
```
### 方案三:检查后端日志
查看后端服务日志,寻找 500 错误的详细堆栈信息:
```bash
# 如果后端使用日志文件
tail -100 /path/to/application.log
# 或查看控制台输出
```
## 验证修复
修复后,执行以下测试:
```bash
# 1. 获取 Token
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456","role":"admin"}' | \
grep -o '"token":"[^"]*"' | cut -d'"' -f4)
# 2. 测试课程创建
curl -s -X POST http://localhost:8080/api/v1/admin/courses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"name":"测试课程",
"themeId":4,
"gradeTags":"[\"小班\"]",
"coreContent":"测试内容",
"durationMinutes":25
}'
# 期望返回:{"code":200,"message":"操作成功",...}
```
## 前端修复
已修复前端字段名称不匹配问题:
- `duration``durationMinutes`
修改文件:`reading-platform-frontend/src/views/admin/courses/CourseEditView.vue:320`