2011-08-28 52 views
2

我是db编程的新手。 我到处读到,如果我遇到问题,我可以使用trasactions来回滚我的操作。使用MYSQL transcations,基本问题

我想知道有关事务:

  1. 没有一个交易“锁定”的分贝?
  2. 如果发生锁定,其他用户访问db会发生什么情况?他们可能会收到错误消息吗?我应该以编程方式检查这样的错误,然后再试一次吗?

是否有事情要做,使我的数据库准备交易?比如将autocommit设置为关闭?还有别的事吗 ? 使用交易有缺点吗?这对我来说似乎都很好。

在此先感谢!

回答

2

整个数据库从不锁定,这将是非常低效的。 而是,MySQL(取决于存储引擎)锁定记录,并在某些情况下锁定整个表格。

您需要确保存储引擎是InnoDB,否则交易不可能。 自动提交功能仅存在于连接客户端中,每次更改数据库时都会发出提交。

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

如果你需要在你的数据库提供的一致性,才应使用交易,即一串记录在一起应该写在1路走,或者根本没有。

1
  1. 简单的答案是肯定的。
  2. 正在等待的查询将一直等到表未被锁定后再执行。

您应该知道,根据您正在使用的数据库引擎(默认情况下为MyISAM),锁定是按表进行的。有像InnoDB这样的不同引擎可以实现行锁定。

此外,即使它们全部位于不同的表上,也可以同时执行多个查询。如果你超过这个数字,你也会收到一个锁。您可以在phpmyadmin中查看您收到的锁的数量,以确定数据库处理中是否存在问题。

关于事务处理:有时您希望使用部分信息更新数据库。这真的取决于你的使用。

+0

MyISAM不支持事务,表级和行级锁不完全是事务锁,它们是在存储引擎中实现的锁定机制。 –

1

答案1.不可以。它根据查询的性质锁定部分表或完整表。这些locak可以被读取或写入锁定。回答2.如果用户想要锁定另一个用户有写入锁定的表格的一部分,则用户被保持到锁定变为空闲状态。如果另一个用户具有读锁定并且用户想要写锁定,则用户被保持直到锁定变为空闲。您需要阅读有关死锁的信息。

希望有所帮助。

2
  1. 号他们allow queries to lock specific portions of the database,并允许数据库引擎来呈现甚至正在更新表中的数据到其他客户端的统一视图。

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

并非所有的表引擎支持事务,所以你需要使用一个没有(例如InnoDB),和交易做需要大量的时间来处理非零量。

+0

他们看到的实际上取决于隔离级别,但作为一种简化,您的答案是完全正确的。 +1 –

1

因为我们正在谈论的MySQL和交易,是全部的答案是关于InnoDB的,虽然大部分是适用于任何存储引擎,支持事务。

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

通常更新使用写入锁,这意味着另一个事务不能更新同一行,但可以读取它。如果你尝试访问一个被锁定的行,MySQL将等待,直到达到锁定等待超时,然后将终止该查询,通知你达到了锁定等待超时。通常这不应该发生。最危险的部分然而使用事务,推出dead-locks - 当transaction A更新record1并尝试更新record2,这是由transaction B锁定 - transaction B已经更新record2并尝试更新record1,但record1A锁定,这样既等待彼此。

一般建议是尽可能保持您的事务处于尽可能小的状态,并尽早锁定要更新的行,以防止死锁(您可以使用select ...来更新)。

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