如何防止在从数据库中写入和读取时并发?

xdnvmnnf  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(458)

我有一个与用户登录信息和注册表太。因此,当两个用户连续尝试添加其详细信息时:
写入冲突和表都不会更新吗?
使用线程进行这些写操作是个坏主意。对于每一次写操作,都会创建一个新线程并阻塞服务器。服务器是否负责自己管理?
锁table是个好主意吗?
我的后端在php/apache上运行,数据库使用mysql(innodb)。

ewm0tg9j

ewm0tg9j1#

BEGIN;
do related reads/writes to the data
COMMIT;

在这个“事务”中,连接可以看到数据的一致视图,并阻止其他任何人干扰该视图。
也有例外。主要是

BEGIN
SELECT ... FOR UPDATE;
fiddle with the values SELECTed
UPDATE ...;  -- and change those values
COMMIT;

这个 SELECT .. FOR UPDATE 宣布什么不应该被篡改。如果另一个连接想要弄乱相同的行,则必须等到 COMMIT ,这时他可能会发现事情发生了变化,他需要做一些不同的事情。但是,一般来说,这避免了“死锁”,即两个事务相互严重干扰,一个必须“回滚”。
有了这样的技术,“并发”只会被简单而相对精确地阻止。也就是说,如果两个连接使用不同的行,那么两个连接都可以继续——不需要“防止并发”。

0ejtzxu1

0ejtzxu12#

关系数据库的设计就是为了避免这种情况。您不需要担心它们,除非您是从头开始设计自己的关系数据库。
简而言之,只要知道这一点:任何时候开始写操作时,都有一个行级锁。如果另一个事务想写入同一行,那么它必须等到第一个事务释放锁。这是关系数据库的基本部分。您不需要添加锁,因为他们已经想到了:)
您可以在这里阅读更多关于mysql如何执行锁以避免死锁和其他事务错误的信息。

nqwrtyyt

nqwrtyyt3#

如果你真的对此有点偏执,或者当你注册一个用户时你正在做很多事情,并且需要原子化地完成它们,那么你可能想看看在mysql中使用事务。这里有一份关于交易的不错的报告http://www.mysqltutorial.org/mysql-transaction.aspx

相关问题