使用MYSQL事务,基本问题

时间:2011-08-28 08:54:39

标签: mysql transactions

我是db编程的新手。 我到处读到,如果我遇到问题,我可以使用trasactions来回滚我的行为。

我想知道交易:

  1. 交易“锁定”数据库?
  2. 如果发生锁定,访问数据库的其他用户会发生什么?他们可能会收到错误消息吗?我应该以编程方式检查这样的错误并再试一次吗?
  3. 有没有办法让我的数据库为事务做好准备?喜欢将自动提交设置为关闭?还有别的事吗 ? 使用交易有不利之处吗?这对我来说似乎都很好。

    提前致谢!

5 个答案:

答案 0 :(得分:2)

  1. 没有。它们allow queries to lock specific portions of the database,并允许数据库引擎向其他客户端呈现统一的数据视图,即使在正在更新的表上也是如此。

  2. 他们会在相关查询发生之前看到数据,并且可能会阻止他们写入表格。

  3. 并非所有表引擎都支持事务,因此您需要使用一个(例如InnoDB),并且事务确实需要非零时间来处理。

答案 1 :(得分:2)

整个数据库永远不会被锁定,效率非常低。 相反,MySQL(取决于存储引擎)会锁定记录,在某些情况下会锁定整个表格。

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

事务会导致开销,并可能导致严重的性能问题。如果你试图以一种又一种的方式在事务上写入相同的记录(让我们在你的主页上说一个命中计数器),那么它就会锁定这条记录并阻止很多写入。

如果您需要在数据库中提供一致性,那么您应该只使用事务,即一堆记录应该一次写入,或者根本不写入。

答案 2 :(得分:1)

  1. 简单的答案是肯定的。
  2. 等待查询将等到表未锁定然后执行。
  3. 您应该知道,根据您使用的db引擎,默认情况下是MyISAM,锁定是按表格进行的。 InnoDB有不同的引擎可以进行Row-Locking。

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

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

答案 3 :(得分:1)

Ans 1.否。它会根据查询的性质锁定部分表或完整表。这些locak可以是读或写锁。 Ans 2.如果用户想要锁定另一个用户具有写锁定的表的一部分,则用户将被保持直到锁变为空闲状态。如果其他用户具有读锁定并且用户想要写锁定,则用户被保持直到锁定变为空闲。你需要阅读有关死锁的信息。

希望有所帮助。

答案 4 :(得分:1)

由于我们讨论的是MySQL和交易,所以整个答案都是关于InnoDB的,尽管其中大部分都适用于任何支持交易的存储引擎。

事务中的锁定取决于存储引擎和transaction isolation level。 MySQL / InnoDB使用行版本实现事务,并降低所有隔离级别中使用的锁数,但可序列化除外。 MySQL中的默认隔离级别是可重复读取。

通常,更新使用写锁,这意味着另一个事务不能更新同一行,但可以读取它。如果您尝试访问被锁定的行,MySQL将等待直到达到锁定等待超时,然后将终止查询,通知您已达到锁定等待超时。通常这不应该发生。然而,使用交易中最危险的部分是引入dead-locks - 当transaction A更新record1并尝试更新被record2锁定的transaction B时 - { {1}}已更新transaction B并尝试更新record2,但record1record1锁定,因此两者都相互等待。

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

可以在MySQL documentation和MySQL认证指南中找到大量信息。