我是db编程的新手。 我到处读到,如果我遇到问题,我可以使用trasactions来回滚我的行为。
我想知道交易:
有没有办法让我的数据库为事务做好准备?喜欢将自动提交设置为关闭?还有别的事吗 ? 使用交易有不利之处吗?这对我来说似乎都很好。
提前致谢!
答案 0 :(得分:2)
没有。它们allow queries to lock specific portions of the database,并允许数据库引擎向其他客户端呈现统一的数据视图,即使在正在更新的表上也是如此。
他们会在相关查询发生之前看到数据,并且可能会阻止他们写入表格。
并非所有表引擎都支持事务,因此您需要使用一个(例如InnoDB),并且事务确实需要非零时间来处理。
答案 1 :(得分:2)
整个数据库永远不会被锁定,效率非常低。 相反,MySQL(取决于存储引擎)会锁定记录,在某些情况下会锁定整个表格。
您需要确保存储引擎是InnoDB,否则无法进行交易。 Autocommit是一种仅存在于连接客户端中的功能,它只会在您每次更改数据库时发出提交。
事务会导致开销,并可能导致严重的性能问题。如果你试图以一种又一种的方式在事务上写入相同的记录(让我们在你的主页上说一个命中计数器),那么它就会锁定这条记录并阻止很多写入。
如果您需要在数据库中提供一致性,那么您应该只使用事务,即一堆记录应该一次写入,或者根本不写入。
答案 2 :(得分:1)
您应该知道,根据您使用的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
,但record1
被record1
锁定,因此两者都相互等待。
一般建议是尽可能减少事务,并尽可能早地锁定要更新的行,以防止死锁(您可以使用select ...进行更新)。
可以在MySQL documentation和MySQL认证指南中找到大量信息。