问题描述现在有一个需求数据库表中有一个值我需要查询出来修改这个值之后再存回数据库。下一个请求来到查询出刚刚的新值修改之后保存。循环往复。。。假设是多线程请求那么第一个请求来到获取值在修改保存到数据库之前。第二个请求也来获取值。这时两个请求拿到的是同一份值然后第一个请求保存接着第二个请求保存。这种情况下如果每个请求修改值的逻辑相同第一个请求保存的值将会被第二个请求覆盖。即上面两个请求只做了一件事。因为第一个请求已经把事情做了按照我们的想法第二个请求应该拿着第一件事的结果去做下一件事。但是第二个请求仍然做的第一件事。出现了我们预料之外的情况。我根据Postgresql的事务和锁的机制对这种情况进行了解决。首先我们要理解锁的概念。第一个请求拿到值修改保存之前绝对不能让别的请求也拿到这个值。也就是在某个请求拿到值时要对该数据进行加锁。修改保存之后将锁放开。其次为什么需要使用到事务是因为锁是基于事务实现的锁只能在事务中使用。事务提交或者回滚时锁被自动释放。上面简单介绍了一些理论接下来实践一下。查询语句 --开启事务 begin; --锁表锁定表之后只有当前事务可以操作。具体锁表还是锁行视业务而定 LOCK TABLE count IN ACCESS EXCLUSIVE MODE; --查询 select * from disorder_count limit 1 ; 修改语句 --更新数据 update count set count ?1 ; --提交事务 commit ;执行完查询语句之后直到当前事务出现commit获取rollback锁才会释放当前事务才会停止。若心存疑惑可自行研究postgresql的事务和锁相关内容。
相关新闻
http请求方法:get和post区别
get
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制 ,大多数浏览器通常都会限制url长度在2K个字…
TEL HTE-0V5-B-11 电路板,核心特点如下(共15条):中间(15条)东京电子原厂配套电路板,用于半导体设备核心控制单元。专为高精度工艺场景设计,满足设备长期稳定运行要求。采用多层PCB结…
告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub
你是否也曾为官方Om…