当多个apache线程试图访问数据库时,如何确保只插入一条记录?

EDJ*_*EDJ 2 php mysql apache

我有一个Web服务(确切地说是xmlrpc服务),它可以处理将数据写入数据库的其他事项.这是场景:

我经常收到更新或插入记录的请求.我会做的是:

  1. 如果记录已存在,请附加到记录中,
  2. 如果没有,请创建一个新记录

问题在于,某些时候我会收到"爆发"的请求,这会产生几个apache线程来处理请求.这些"爆发"将在不到几毫秒的时间内完成.我现在有几个线程执行#1和#2.通常两个线程将"传递"数字#1并实际创建两个重复记录(主键除外).

我想使用一些锁定机制来防止其他线程在另一个线程完成其工作时访问该表.我只是害怕使用它,因为如果发生了什么事,我不想让桌子锁定.

  • 更新:该表已有主键.理想情况应该是第一个线程应该创建记录,如果它不存在,那么一旦第二个线程进入,它将不会创建另一个记录,而只是更新已经创建的记录.这几乎就像我想让线程形成一个单行文件.

有一个坚实的方法来处理这个?如果我能正确使用,我愿意使用锁.

谢谢,

Wri*_*ken 5

添加唯一索引或主索引并使用:

INSERT INTO table (..) VALUES (...) ON DUPLICATE KEY UPDATE .....
Run Code Online (Sandbox Code Playgroud)