fix(mysql): handle table initialization better in clustered database environments
The CREATE TABLE IF NOT EXISTS yields more locks than checking if the table exists using a SELECT first before running CREATE TABLE. This makes more sense as the table usually already exists, so we optimize for the happy path.
This commit is contained in:
parent
e396266f3d
commit
aef2d7c861
2 changed files with 23 additions and 1 deletions
5
.changeset/thirty-beds-fetch.md
Normal file
5
.changeset/thirty-beds-fetch.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'@emigrate/mysql': patch
|
||||
---
|
||||
|
||||
Avoid "CREATE TABLE IF NOT EXISTS" as it's too locking in a clustered database when running it concurrently
|
||||
|
|
@ -156,9 +156,26 @@ const deleteMigration = async (pool: Pool, table: string, migration: MigrationMe
|
|||
};
|
||||
|
||||
const initializeTable = async (pool: Pool, table: string) => {
|
||||
const [result] = await pool.execute<RowDataPacket[]>({
|
||||
sql: `
|
||||
SELECT
|
||||
1 as table_exists
|
||||
FROM
|
||||
information_schema.tables
|
||||
WHERE
|
||||
table_schema = DATABASE()
|
||||
AND table_name = ?
|
||||
`,
|
||||
values: [table],
|
||||
});
|
||||
|
||||
if (result[0]?.['table_exists']) {
|
||||
return;
|
||||
}
|
||||
|
||||
// This table definition is compatible with the one used by the immigration-mysql package
|
||||
await pool.execute(`
|
||||
CREATE TABLE IF NOT EXISTS ${escapeId(table)} (
|
||||
CREATE TABLE ${escapeId(table)} (
|
||||
name varchar(255) not null primary key,
|
||||
status varchar(32),
|
||||
date datetime not null
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue