我可以使用这个函数代替“LOCK TABLES”查询吗?
例子:
pdo::beginTransaction();
SELECT id AS last_id FROM t WHERE...
INSERT INTO t (id,...) VALUES (last_id+1,....)
pdo::commit();
答案是:视情况而定。帮助您准确了解它做什么、不做什么以及它是如何工作的最重要资源在这里。
首先,这取决于底层驱动程序(MySQL、MSSQL 等)是否完全支持事务功能。如果驱动程序不支持事务,pdo::beginTransaction();
将失败并返回FALSE
,并且您的所有查询将立即执行。这并不是说LOCK TABLES
查询会失败——这取决于底层数据库引擎是否支持它。
事实上,至少在 MySQL 中,遵循与语句pdo::beginTransaction()
相同的规则。START TRANSACTION
它不会立即锁定表,它只是确保作为事务一部分的查询遵循ACID的规则。
我不会详细说明哪些组合会起作用以及它们会做什么,因为它们在我链接到的文档中有详细介绍,而且我没有必要再把它们全部写出来。