Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 让多个用户访问PSQL数据库_Postgresql_Connection_Psql - Fatal编程技术网

Postgresql 让多个用户访问PSQL数据库

Postgresql 让多个用户访问PSQL数据库,postgresql,connection,psql,Postgresql,Connection,Psql,我是这个主题的新手,我所做的只是为一个用户连接到数据库,所以我不熟悉让多个用户访问数据库 我的案例是:10家工厂将使用我的程序记录工人进出的时间,数据库将位于主服务器上,我在编程/测试该程序时只使用了一个用户。我的问题是:多个远程位置是否可以使用一个用户连接数据库(应该不会发生冲突,因为它们都在编写不同的内容,但在同一个表中),如果不是这样,我该怎么办?好的关系数据库可以很好地处理这一问题,它是“I”在关系数据库中,事务的所谓属性;它代表孤立 并发进程受到保护,不会同时写入同一个表行,锁会阻止其

我是这个主题的新手,我所做的只是为一个用户连接到数据库,所以我不熟悉让多个用户访问数据库


我的案例是:10家工厂将使用我的程序记录工人进出的时间,数据库将位于主服务器上,我在编程/测试该程序时只使用了一个用户。我的问题是:多个远程位置是否可以使用一个用户连接数据库(应该不会发生冲突,因为它们都在编写不同的内容,但在同一个表中),如果不是这样,我该怎么办?

好的关系数据库可以很好地处理这一问题,它是“I”在关系数据库中,事务的所谓属性;它代表孤立

并发进程受到保护,不会同时写入同一个表行,锁会阻止其他事务,直到一个事务完成写入

通过(MVCC)保护读卡器不受并发写入的影响,MVCC保留数据的旧版本,以便在不阻塞任何人的情况下为读卡器服务

如果您将所有属于同一事务的数据修改都封装到一个事务中,使它们以原子方式发生(ACID中的“a”),并且您的事务简单而简短,那么您的应用程序可能工作得很好

如果不满足这些条件,可能会出现问题:

  • 如果数据修改不受事务保护,则并发会话可能会看到不同会话的中间、不完整结果,从而处理不一致的数据

  • 如果您的事务很复杂,事务中的后续语句可能以间接方式依赖于先前语句的结果。修改数据的并发活动可能会打破这一假设。有三种方法:

    • 悲观锁定:第一次使用所有数据时,使用类似于
      SELECT。。。用于更新
      ,以便在您的交易完成之前,任何人都无法修改它们

    • 乐观锁定:不锁定,但每当您第二次访问数据时,请检查在此期间是否没有其他人对其进行了修改。如果是这种情况,请回滚事务并重试

    • 使用高事务隔离级别,如
      REPEATABLE READ
      SERIALIZABLE
      ,可以更好地保证您使用的数据不会同时被修改。如果数据库无法保持保证,您必须准备接收序列化错误,在这种情况下,您必须回滚事务并重试

    这些技术以不同的方式实现相同的目标。讨论何时使用哪一个超出了本答案的范围

  • 如果事务很复杂和/或需要很长时间(尽量避免长事务,因为它们会在数据库中引起各种问题),则可能会遇到死锁,即两个事务以一种“致命的拥抱”相互锁定。 数据库将检测到这种情况,并以错误中断其中一个事务

    有两种方法可以解决这个问题:

    • 通过始终按特定顺序锁定资源来避免死锁(例如,始终首先使用较低的帐号更新帐户)

    • 当遇到死锁时,代码必须重试事务

    与人们普遍认为的相反,僵局不一定是一个bug


我建议您阅读PostgreSQL文档。

非常感谢您的回复,还有一件事:基本上,如果我将事务中的所有内容都锁定,并尽可能避免死锁,我会没事吧?关于一个查询使用另一个查询的result的事情,发生在我的代码中,但它从未发生在一个查询中,除非我在主表中插入一个新行来存储有关员工的数据,以及他何时来/离开工作。另外,封装事务中的每个查询是否明智?每个查询都自动包含在一个只包含该语句的事务中。如果有一组问题或修改一起进行,则必须显式启动事务。如果您立即锁定所使用的所有内容,您应该是安全的,但是如果许多会话使用相同的数据,并发性可能会受到影响-它们基本上必须排队而没有并行性。