V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  daxiguaya  ›  全部回复第 1 页 / 共 1 页
回复总数  10
2023-01-19 15:16:50 +08:00
回复了 h0099 创建的主题 程序员 如何从理论上避免这类并行任务交错执行时的冲突问题
@h0099 1. 我对于"进程锁"所要处理的问题有不一样的看法. 我认为"进程锁"应当能解决你提出的"幻读"的问题,它存的是真正写入的数据. 你担心"无事可做",只能说目前只能保证不会重复插入导致整个事务回滚,这个应该更重要? 关于"饥饿"的问题,如果真的是瓶颈的话,可以提早去识别"垃圾数据": 非当前所有活跃"写事务"需要的数据都是"垃圾数据"

2. 就算有各种释放锁、忽略的机制我认为还是有漏洞(还是上面说的那个时机),关键点在于向"进程锁"写入数据在提交之前. 确实加了些机制容错,但在 `"线程 1"向"进程锁"插入数据->处理失败"进程锁"数据` 的中间会有`"线程 2"读取"进程锁"`. 如果有理解不对的地方可以直接忽略掉.

PS: `SELECT ... FOR UPDATE`这个问题我保留观点,还要考虑间隔锁、表锁之类的问题,除非死锁的时候我会去 DEBUG 数据库的锁状态,其它情况我想操这个心 :)
2023-01-17 11:48:23 +08:00
回复了 h0099 创建的主题 程序员 如何从理论上避免这类并行任务交错执行时的冲突问题
1. 图 1 中的"进程锁"清理数据的时机可以调整下,等到没有任何活跃事务的情况下再把它清掉.

2. 图 1 的设计中向"进程锁"插入数据的时机看起来有问题: 如果"线程 1"锁定完后(数据 A)事务处理失败了,那么"线程 2"存在也忽略掉(数据 A). 时机是"线程 1"-"锁新插入行"后,""释放新插入行锁""之前"线程 2"获取"已被锁的行".

PS: 这些是基于单体服务的设计. 我不喜欢用`SELECT ... FOR UPDATE`,它通常会让我其它功能查询也被无辜的阻塞
2022-12-05 10:58:21 +08:00
回复了 andyJado 创建的主题 问与答 没有国外手机号,好想玩 CHATGPT🥺
有个免费的,得多试几次: https://sms24.info/en/messages/OpenAI/1
2022-01-20 18:21:44 +08:00
回复了 huazhaozhe 创建的主题 git git 如何所有分支里边搜索代码片段
2021-08-01 13:06:17 +08:00
回复了 zstone123 创建的主题 程序员 如何对业务代码中进行抽象和提取公有逻辑呢?
放几篇文章出来看看有没有帮助.

https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html
http://sunnyday.mit.edu/16.355/parnas-criteria.html

如果看了些 DDD 相关的资料觉得比较抽象的话,推荐一篇我最近看的: https://tech.youzan.com/dddclue/
2021-08-01 10:18:57 +08:00
回复了 Sparkli 创建的主题 程序员 聊聊互联网公司监控技术栈选型
可以业余去"了解"下 https://opentelemetry.io/
2021-03-02 14:53:22 +08:00
回复了 sanggao 创建的主题 程序员 求推荐有深度的 mysql 文章或者博客
掘金有个小册《 MySQL 是怎样运行的》,入个门没问题.
2020-12-21 20:04:14 +08:00
回复了 duanzs 创建的主题 MySQL mybatis 如何拦截空 where 条件的 sql
写个拦截器,用 jsqlparser 解析 SQL,剩下的想怎么限制都行.
2020-04-03 12:15:38 +08:00
回复了 rizon 创建的主题 程序员 在线等求助, spring 配置如何判断用户是否创建了数据源
实际上得看数据源从哪里注册进去的,从 META-INF/spring.factories 里的自动配置注册进去的话得这样: https://paste.ubuntu.com/p/NZPyqT5pXC/
2019-08-31 14:27:31 +08:00
回复了 wsy190 创建的主题 程序员 写程序这么精简真的好吗?
首先,如果这是公司项目的代码的话我建议还是不要动别人的好些.
每个人每个阶段代码风格不一样很正常,如果 LZ 很在意这些会可能影响到"日常交互"的话也可以找上级要一个
"最低限度"的标准呀,这也不是什么坏事是吧.

回到这种链式调用的代码上来说 LZ 发的这段代码其实还算"中规中矩"把,我发段我以前写的:
```
targetExamPoints.stream().filter(x -> !ObjectUtil.isEmpty(x.getParentId())).forEach(x -> x.setParentId(targetExamPointMapped.get(treeNodePrefix + sourceExamPointMapped.get(treeNodePrefix + sourceExamPointMapped.get(treeNodePrefix + x.getName()).getParentId()).getName()).getId()));
```
这段代码的后果就是后来测的时候出了问题我自己都得拆开来看了.

还有就是前排有个说 SimpleDateFormat 线程不安全的,如果 LZ 在意那段的话可以看看:
https://stackoverflow.com/questions/41158005/can-anyone-give-me-an-example-of-showing-simpledateformat-is-thread-unsafe
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3597 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 32ms · UTC 04:26 · PVG 12:26 · LAX 20:26 · JFK 23:26
Developed with CodeLauncher
♥ Do have faith in what you're doing.