我需要从设置为空闲的 SQLite 数据库中选择一行,然后将该行标记为已占用。至关重要的是,选择和更新是原子操作,并且不会有两个用户将同一行免费返回的风险。
不幸的是,Laravel 在调用时似乎没有提供事务类型的选择DB::transaction
,如果我将它作为 a 运行,DB::statement
那么我将不会获得返回的值。
此外,由于 SQLite 不支持变量,我无法在选择和更新之间存储主键,所以我不确定是否可以在 SQLite 数据库中运行它。
可以使用 Laravel 和 SQLite 吗?
如果没有,那么我需要将下一个空闲 ID 存储在与 SQLite 数据库相关的 MySQL 表中,并在该行上使用锁定。在 MySQL 中按行锁定是否有任何主要的语法差异?(我不能不小心锁定整个桌子)
我正在查看与此类似的语法:(当然 SQLite 不支持变量除外)
BEGIN EXCLUSIVE TRANSACTION
SET @free = SELECT InternalID FROM main WHERE Called = 0 LIMIT 1;
UPDATE main SET Called = 1 WHERE InternalID = @free;
SELECT * FROM main LEFT JOIN lead ON main.InternalID = lead.InternalID WHERE main.InternalID = @free;
END TRANSACTION
因为我确定有人会问“你为什么使用两个数据库系统!?!”:
SQLite 数据库包含需要灵活数量的列的数据。这些数据将每周使用几天,持续几个月,然后可以存档。需要有相当多的这些“小型数据库”。这些数据不能有效地存储在 MySQL 中(我要替换的以前的系统尝试过这个,它变得非常慢)。每个 SQLite db 上的并发性将非常低,但至关重要的是,绝对没有两个用户获得同一行的机会 - 在旧系统中已经发生过几次。