【问题标题】:How to select value after update at one atomic operation in MySQL如何在 MySQL 中的一个原子操作更新后选择值
【发布时间】:2014-01-06 08:31:40
【问题描述】:

这里我想增加字段计数,然后在一个原子操作中选择计数结果。

代码是:

sql = ("update user_cout set count = count+1 "
               "where username=%s")
cursor = connection.cursor()
cursor.execute(sql, (username, ))
cursor.execute("select count from user_count "
                       "where username=%s", (username, ))

有什么推荐的方法吗?

【问题讨论】:

  • 你的做法有什么问题?
  • @Barmar 它可以在一个语句中工作吗?这两条语句应该是原子操作
  • 我认为您需要关闭光标并重新打开它才能计数
  • @AshReva 我更新了这个问题,这两个操作应该在一个事务中或一个语句中
  • @AshReva 但如果他这样做,其他进程可能会更新计数,他会得到错误的值。他想留在交易中,以便获得他刚刚分配的价值。

标签: python mysql mysql-python


【解决方案1】:

您需要在事务中执行UPDATESELECT(即未自动提交的语句):

connection.autocommit(0);

然后可以执行现有语句并显式将它们提交到数据库:

connection.commit();

注意,要实现原子性,user_count 表必须使用事务存储引擎(例如 InnoDB)。

【讨论】:

    【解决方案2】:

    @linbo,您可以在您的数据库中创建一个函数/过程 (check how to do so here),然后在您的代码中只运行一次调用:

    sql = ("SELECT MY_CUSTOM_FUNC(%s)")
    cursor = connection.cursor()
    cursor.execute(sql, (username, ))
    

    使用这种方法有很多优点:

    1. 您可以集中您的逻辑,可以从应用程序的许多地方调用它;
    2. 代码少;
    3. 一旦对 db 进行简单操作,MySQL 在函数中默认使用原子性;

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2016-03-27
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多