🥰个人主页:会编程的土豆(欢迎来访)
💎作者简介:后端学习者
✨那些你一个人走过的夜路,终将化作照亮未 来的光



学后端一段时间后会发现:很多坑不在语法,而在概念没分清。下面把几件特别容易搅在一起的事拆开说------不绑具体项目,换成别的业务也一样适用。
一、业务锁和数据库行锁,不是一回事
很多人一听「锁座位 / 锁库存」,以为就是数据库的锁。其实通常有两层:
业务锁
用业务字段表达「这个资源暂时被占用了」。例如:状态改成「已锁定」、记下是谁锁的、记下锁到什么时候。别人查询时看到「已锁定」,就不能再下单。这是业务规则。
数据库行锁(如 SELECT ... FOR UPDATE)
在事务里锁住某一行,防止两个请求同时读到「还空着」然后都更新成功。这是并发控制。
一句话:业务锁回答「能不能卖」;行锁回答「会不会两个人同时改成功」。
下单流程里常见组合是:事务里先加行锁检查状态 → 再改成业务锁定并写入过期时间。
二、「过期自动释放」并不是时间一到字段自己变
很多系统会说「锁定 15 分钟」「订单 15 分钟未支付自动取消」。实现上通常是:
- 下单时用配置算出截止时间,写进数据库(lock_until / pay_deadline 这类字段)
- 后台定时任务周期性扫描:谁过期了,就把状态改回去
也就是说:「15」出现在创建资源的时候;释放函数往往不再接收这个 15,只查库里的截止时间是否已过。
可以记成:配置分钟数 → 下单写成绝对时间 → 定时器用「现在 vs 截止时间」清理。
另外,支付超时和锁定超时可以是两条线:一个管订单状态,一个管资源占用;默认分钟数相同,不代表是同一个字段。
三、Go 解析时间:为什么布局里必须写 2006?
Go 的 time.Parse / ParseInLocation 第一个参数不是「举个例子」,而是一套固定占位符,来自参考时间:
2006-01-02 15:04:05
含义对应关系:年用 2006,月用 01,日用 02,时用 15,分用 04。
所以:布局写成 "2006-01-02 15:04" 表示格式是「年-月-日 时:分」;用户输入仍然可以是 "2026-08-30 14:00",年份照样是 2026。
如果你在布局里写 2026,Go 不认它是「年份占位符」,解析就会失败。填什么年份是业务数据;布局里的 2006 是语言规定。
四、函数里的变量,别的包能直接用吗?
不能。函数内部的变量是局部的,出不了这个函数,更不能被另一个包直接访问。
正确做法是:当参数传过去。
A 包算出截止时间 → 传给 B 包的函数参数 → B 包用自己的参数名接收并写入数据库。
这不是限制,而是封装:谁创建、谁使用,边界清晰。
五、结构体字段名和数据库列名:看起来不像,其实是同一个
例如 Go 里写 PayDeadline,库里是 pay_deadline,JSON 也可能是 pay_deadline。
这在 ORM(如 GORM)里很常见:代码用导出字段(大驼峰),表用下划线列名,框架负责映射。
写原生 SQL 条件时要用列名;给结构体赋值时用字段名。记住「同一个东西,两套名字」就不会懵。
六、网站里的图片路径:桌面路径没用
Web 应用展示图片,靠的是浏览器能请求到的 URL,例如 /static/img/cover.jpg,而不是 C:\Users\xxx\Desktop\photo.jpg。
原因很直接:浏览器不能随便读用户磁盘;服务端通常只对外提供指定静态目录。
正确流程是:文件放进项目的静态资源目录 → 存相对站点的 URL → 页面用 img 加载。后台如果只是一个「图片 URL」输入框,往往不会自动解析、预览本地文件,只是把字符串存起来。
七、外键没有 ON DELETE CASCADE 时,删除会被拦住
数据库外键不只是「关联一下」,还决定删主表时怎么办:
- 写了 ON DELETE CASCADE:删主记录时,从表相关行一起删
- 没写:默认常常是「还有子记录就禁止删除」
所以「删除电影 / 删除商品失败」,不一定是业务代码写了限制,很可能是库里还有订单、场次、明细在引用它。排查时:先看建表 SQL 里的 FOREIGN KEY,再看业务删除逻辑。
八、一点学习上的体会
后端难的部分,经常不是 CRUD,而是:并发下资源不能超卖、超时状态怎么收敛、配置 / 写入 / 定时清理如何串成闭环。
把概念拆开(业务锁 / 行锁,截止时间 / 定时任务,布局占位符 / 真实年份),代码读起来会顺很多,也更容易向别人讲清楚。
小结
| 易混点 | 记住一句 |
|---|---|
| 业务锁 vs 行锁 | 一个管规则,一个管并发 |
| 15 分钟过期 | 写入截止时间 + 定时扫描,不是魔法自动变 |
| Go 的 2006 | 布局暗号,不是限制业务年份 |
| 跨包变量 | 局部变量靠传参 |
| 字段 vs 列名 | 同一数据,两套命名 |
| 海报路径 | 用站点 URL,不用桌面路径 |
| 删除失败 | 先查外键策略 |
如果你也在学后端,不妨拿自己的项目对照这几条走一遍:哪里加锁、哪里写截止时间、谁负责过期清理。能讲顺,往往比多写一个接口更有用