我有一个有关在线交易的问题,想用SELECT和UPDATE查询来阐明以下问题.
我将使用以下示例向您解释.
X正在进行在线交易.他的帐户余额为$1000.他打算购买200美元的物品,然后他的帐户余额应为800美元.那也行;现在让我进一步阐述一下
Begin DB transaction.
Step 1: account balance is $1000
{Select the balance from a different script}
Step 2: Buy something for $200
{Select the balance from another script}
Step 3: Remaining balance $800
Commit DB transaction
正如您在步骤1和3之间看到的那样,余额已由事务外部的另一个查询检查,而另一个脚本正在步骤2和3中再次检查余额.
>对于默认的MysqL事务,first的值是什么
第二平衡结果?默认情况下,MysqL也使用“ SELECT
…“锁定共享模式”或“选择…进行更新”功能或执行
我们必须在查询中使用它们.
>如果我们需要为上述两个余额查询查询返回800美元,
等待事务提交,我们可以使用哪种方法,例如:
“选择…锁定共享模式”或“选择…进行更新”
>您还知道MysqL和Post gresql是否处理
与上述交易不同?
解决方法:
在MysqL(带有InnoDB)和Postgresql中,使用READ COMMITTED或SERIALIZABLE隔离模式,余额在第2步和第3步相同.更改仅在事务提交后可见.
使用MyISAM的MysqL可能有所不同,但是如果您关心数据的正确性或一致性,则不应使用它.
除非您特别要求,否则MysqL和Postgresql都不会进行FOR SHARE或FOR UPDATE.
Postgresql和MysqL(InnoDB)在READ COMMITTED模式下的行为应相似.有关Postgresql行为的详细信息,请参见manual on transaction isolation.
如上所述,如果您希望两次读取都达到800,则必须做两件事:
>更新事务必须在插入事务记录并更新余额之前为用户选择… FOR UPDATE余额记录.和
>读取事务(“其他脚本”)必须在每次读取余额时都选择SELECT … FOR SHARE余额,因此只要有人在更新余额,它就会等待,而不仅仅是读取未更改的版本.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。