我正在我正在开发的网站中实施 PayPal 付款标准。这个问题与PayPal无关,我只是想通过我的实际问题提出这个问题。
PayPal 可以通过两种方式通知您的服务器有关付款:
- PayPal IPN - 每次付款后,PayPal 都会向包含交易详细信息的 url(由您选择)发送(服务器到服务器)通知。
- PayPal PDT - 付款后(如果您在您的 PP 帐户中设置),PayPal 会将用户重定向回您的网站,并在 url 中传递交易 ID,因此您可以向 PayPal 查询该交易以获取详细信息。
问题是,你不能确定哪个先发生:
- 您的服务器是否会通过 IPN 通知
- 将用户重定向回您的网站
无论哪个先发生,我都想确保我不会两次处理交易。因此,在这两种情况下,我都会根据来自 paypal 的交易 id(实际上是付款状态......但现在没关系)查询我的数据库,以查看我是否已经保存并处理了该交易。如果没有,我会处理它,并将交易 ID 与其他交易详细信息一起保存到我的数据库中。
问题
如果我开始处理第一个请求会发生什么(让它成为 PDT..so 用户被重定向回我的站点,但 IPN 尚未通知我的服务器),但在我实际将事务保存到数据库之前,第二个(IPN)请求到达,它也会尝试处理事务,因为它在数据库中找不到它。
我很想确保当我将事务写入数据库时,没有其他查询可以读取表,寻找给定的事务 id。
我正在使用 InnoDB,并且不想在写入时锁定整个表。这可以通过事务简单地解决吗,我是否要“手动”锁定该行?我真的很困惑,我希望一些更有经验的mysql开发人员可以帮助我弄清楚这一点并解决问题。