我最近想出了一个案例,让我想知道我是不是新手还是琐事逃脱了。
假设我有许多用户运行的软件,它使用表格。当用户在应用程序中登录时,表格中会显示一系列信息,他只需要添加,工作或更正某些信息即可保存。现在,如果他使用的软件是由很多人运行的,我怎么能保证他是唯一一个使用该特定记录的人?我的意思是我怎么知道记录没有被2个或更多用户同时选中和使用?请不要让答案使用“SELECT FOR UPDATE ...” 因为我读过它对数据库的负面影响太大了。感谢大家。保持良好的工作。
答案 0 :(得分:1)
这主要是由数据库解决的。数据库管理“并发事务”的隔离和锁定。但是当记录发送到客户端时,您通常(并且希望)关闭事务并在它返回时启动新事务。
所以你必须要关心自己。
有不同的方法,我想到的是:
乐观锁定:在存储时检查记录是否同时被更改。通常它通过版本计数器或时间戳来实现。一些ORM和框架可能有助于实现这一点。
悲观锁定:构建一种机制,用于存储某人开始编辑某些内容但不允许其他人编辑内容的信息。特别是在Web项目中,无论如何都要释放锁定时需要超时。
最后获胜:存储记录的第二个人只会覆盖第一个更改。
...让我想知道我是不是新手......
当我们发现我们使用的工具和框架仍然无法解决非常常见的问题时,我们必须一遍又一遍地解决这个问题。
答案 1 :(得分:0)
现在,如果他使用的软件被很多人破坏了,我怎么能保证他 是唯一一个使用该特定记录的人。
...阿
并且我不希望答案使用“SELECT FOR UPDATE ...”因为 我所读到的内容对数据库的影响太大。
谁在乎?我的意思是,这是唯一的方法(保持一排锁),以保证你是唯一可以改变它的人。是的,这限制了吞吐量,但这就是你想要的。
它被称为编程 - 为工作选择合适的工具。在这种情况下,由于要求,需要产生影响。
替代方案 - 不是对数据库的保证,而是应用程序服务器 - 是内存或数据库锁定机制(如表示哪些对象属于哪个用户)。
但是如果你需要保证一个记录仅在数据库级别上被一个人使用,那么你必须保持锁定并处理这种影响。
但严重的是,大多数程序都避免这种情况。他们通过乐观锁定(第二个用户提交更改获得错误)或其他程序员级别的决策处理它,因为这些保证的成本非常高。
答案 2 :(得分:-1)
Oracle与SQL服务器不同。
在Oracle中,当您更新记录或数据集时,旧信息仍然可用,因为您的更新仍在数据库缓冲区缓存上保留,直到提交为止。 因此,阅读相同记录的人将能够看到旧的结果。 如果对此记录的访问是写访问,则在提交之前它将是一个锁,然后您将有权写入相同的记录。 每当锁定无法解决时,就会弹出死锁。
SQL服务器虽然没有能力读取已被锁定以写入更改的记录,因此根据您正在运行的查询,您可能会锁定整个表
首先,您需要使用数据仓库数据库分隔查询和插入/更新。这意味着您可以解决导致锁定的更新中的慢速性能。 下一步是确定导致锁定的原因并分别解决每个案例。
在工作时间内重建索引可能会导致非常讨厌的锁定。几小时后将它们推到一起。