我有一个与用户登录信息和注册表太。因此,当两个用户连续尝试添加其详细信息时:写入冲突和表都不会更新吗?使用线程进行这些写操作是个坏主意。对于每一次写操作,都会创建一个新线程并阻塞服务器。服务器是否负责自己管理?锁table是个好主意吗?我的后端在php/apache上运行,数据库使用mysql(innodb)。
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 ,这时他可能会发现事情发生了变化,他需要做一些不同的事情。但是,一般来说,这避免了“死锁”,即两个事务相互严重干扰,一个必须“回滚”。有了这样的技术,“并发”只会被简单而相对精确地阻止。也就是说,如果两个连接使用不同的行,那么两个连接都可以继续——不需要“防止并发”。
SELECT .. FOR UPDATE
COMMIT
0ejtzxu12#
关系数据库的设计就是为了避免这种情况。您不需要担心它们,除非您是从头开始设计自己的关系数据库。简而言之,只要知道这一点:任何时候开始写操作时,都有一个行级锁。如果另一个事务想写入同一行,那么它必须等到第一个事务释放锁。这是关系数据库的基本部分。您不需要添加锁,因为他们已经想到了:)您可以在这里阅读更多关于mysql如何执行锁以避免死锁和其他事务错误的信息。
nqwrtyyt3#
如果你真的对此有点偏执,或者当你注册一个用户时你正在做很多事情,并且需要原子化地完成它们,那么你可能想看看在mysql中使用事务。这里有一份关于交易的不错的报告http://www.mysqltutorial.org/mysql-transaction.aspx
3条答案
按热度按时间ewm0tg9j1#
在这个“事务”中,连接可以看到数据的一致视图,并阻止其他任何人干扰该视图。
也有例外。主要是
这个
SELECT .. FOR UPDATE
宣布什么不应该被篡改。如果另一个连接想要弄乱相同的行,则必须等到COMMIT
,这时他可能会发现事情发生了变化,他需要做一些不同的事情。但是,一般来说,这避免了“死锁”,即两个事务相互严重干扰,一个必须“回滚”。有了这样的技术,“并发”只会被简单而相对精确地阻止。也就是说,如果两个连接使用不同的行,那么两个连接都可以继续——不需要“防止并发”。
0ejtzxu12#
关系数据库的设计就是为了避免这种情况。您不需要担心它们,除非您是从头开始设计自己的关系数据库。
简而言之,只要知道这一点:任何时候开始写操作时,都有一个行级锁。如果另一个事务想写入同一行,那么它必须等到第一个事务释放锁。这是关系数据库的基本部分。您不需要添加锁,因为他们已经想到了:)
您可以在这里阅读更多关于mysql如何执行锁以避免死锁和其他事务错误的信息。
nqwrtyyt3#
如果你真的对此有点偏执,或者当你注册一个用户时你正在做很多事情,并且需要原子化地完成它们,那么你可能想看看在mysql中使用事务。这里有一份关于交易的不错的报告http://www.mysqltutorial.org/mysql-transaction.aspx