使用MYSQL转换,基本问题

使用MYSQL转换,基本问题,mysql,transactions,Mysql,Transactions,我是db编程新手。 我到处都读到,如果我在路上遇到问题,我可以使用trasactions回滚我的操作 我想了解有关交易的信息: 事务是否“锁定”数据库 如果发生锁定,访问数据库的其他用户会发生什么情况?他们是否可能收到错误消息?我是否应该通过编程检查此类错误并重试 是否有一些事情可以让我的数据库为事务做好准备?比如将自动提交设置为关闭?还有别的吗? 使用事务是否有缺点?我觉得一切都好 提前谢谢 简单的答案是肯定的 等待查询将一直等到表未被锁定,然后执行 您应该知道,根据您正在使用的db引擎,默认

我是db编程新手。 我到处都读到,如果我在路上遇到问题,我可以使用trasactions回滚我的操作

我想了解有关交易的信息:

  • 事务是否“锁定”数据库
  • 如果发生锁定,访问数据库的其他用户会发生什么情况?他们是否可能收到错误消息?我是否应该通过编程检查此类错误并重试
  • 是否有一些事情可以让我的数据库为事务做好准备?比如将自动提交设置为关闭?还有别的吗? 使用事务是否有缺点?我觉得一切都好

    提前谢谢

  • 简单的答案是肯定的
  • 等待查询将一直等到表未被锁定,然后执行 您应该知道,根据您正在使用的db引擎,默认情况下是MyISAM,锁定是表方式的。有不同的引擎,比如InnoDB,可以执行行锁定

    此外,还有许多查询可以同时执行,即使它们都在不同的表上。如果超过此数字,您还将收到一个锁。您可以在phpmyadmin中查看收到的锁的数量,以了解数据库处理中是否存在问题


    关于事务:有时您确实希望使用部分信息更新数据库。这取决于你的使用情况。

    答案1。否。它会根据查询的性质锁定部分表或完整表。这些LOCAK可以是读锁或写锁。 答复2。如果用户希望锁定另一个用户具有写锁的表的一部分,则会一直保留该用户,直到锁释放为止。如果另一个用户有一个读锁,而该用户想要一个写锁,则该用户将被扣留,直到该锁释放为止。你需要仔细阅读有关死锁的资料

    希望有帮助

  • 不需要。它们允许,并允许数据库引擎向其他客户端提供数据的统一视图,即使是在正在更新的表上

  • 他们看到的数据与相关查询发生之前的数据一样,可能会阻止他们写入表


  • 并非所有的表引擎都支持事务,因此您需要使用一个支持事务的表引擎(如InnoDB),并且事务的处理时间不为零。

    整个数据库从未被锁定,这将非常低效。 相反,MySQL(取决于存储引擎)锁定记录,在某些情况下锁定整个表

    您需要确保存储引擎是InnoDB,否则无法进行事务处理。 自动提交是一种仅存在于连接客户端中的功能,它仅在您每次更改数据库时发出提交

    事务将导致开销,并可能导致严重的性能问题。如果您尝试一次又一次地以事务方式写入同一条记录(比如主页上的点击计数器),那么它会锁定该记录,并阻止大量写入


    只有当您需要在数据库中提供一致性时,您才应该使用事务,也就是说,一组记录应该一次性写入,或者根本不写入。

    因为我们讨论的是MySQL和事务,所以整个答案都是关于InnoDB的,尽管大部分对于支持事务的任何存储引擎都是有效的

    事务锁定取决于存储引擎和。MySQL/InnoDB使用行版本控制来实现事务,并降低除serializable之外的所有隔离级别中使用的锁的数量。MySQL中的默认隔离级别是可重复读取

    通常更新使用写锁,这意味着另一个事务不能更新同一行,但可以读取该行。如果您试图访问一个被锁定的行,MySQL将等待直到达到锁定等待超时,然后将终止查询,通知您已达到锁定等待超时。通常这不应该发生。然而,使用事务时最危险的部分是引入了死锁,即当事务A更新了记录1并试图更新记录2时,被事务B锁定的事务B已经更新了记录2并试图更新记录1,但是
    record1
    A
    锁定,所以两者都在等待对方

    一般建议是使事务尽可能小,并尽早锁定要更新的行,以防止死锁(您可以使用select…进行更新)


    在MySQL认证指南中可以找到很多信息。

    MyISAM不支持事务,表级和行级锁并不完全是事务锁定,它们是存储引擎中实现的锁定机制。它们看到的实际上取决于隔离级别,但作为一种简化,你的回答完全正确+1.