Postgresql解决多线程高并发情况下的安全问题

Postgresql解决多线程高并发情况下的安全问题 问题描述现在有一个需求数据库表中有一个值我需要查询出来修改这个值之后再存回数据库。下一个请求来到查询出刚刚的新值修改之后保存。循环往复。。。假设是多线程请求那么第一个请求来到获取值在修改保存到数据库之前。第二个请求也来获取值。这时两个请求拿到的是同一份值然后第一个请求保存接着第二个请求保存。这种情况下如果每个请求修改值的逻辑相同第一个请求保存的值将会被第二个请求覆盖。即上面两个请求只做了一件事。因为第一个请求已经把事情做了按照我们的想法第二个请求应该拿着第一件事的结果去做下一件事。但是第二个请求仍然做的第一件事。出现了我们预料之外的情况。我根据Postgresql的事务和锁的机制对这种情况进行了解决。首先我们要理解锁的概念。第一个请求拿到值修改保存之前绝对不能让别的请求也拿到这个值。也就是在某个请求拿到值时要对该数据进行加锁。修改保存之后将锁放开。其次为什么需要使用到事务是因为锁是基于事务实现的锁只能在事务中使用。事务提交或者回滚时锁被自动释放。上面简单介绍了一些理论接下来实践一下。查询语句 --开启事务 begin; --锁表锁定表之后只有当前事务可以操作。具体锁表还是锁行视业务而定 LOCK TABLE count IN ACCESS EXCLUSIVE MODE; --查询 select * from disorder_count limit 1 ; 修改语句 --更新数据 update count set count ?1 ; --提交事务 commit ;执行完查询语句之后直到当前事务出现commit获取rollback锁才会释放当前事务才会停止。若心存疑惑可自行研究postgresql的事务和锁相关内容。