diff --git a/dictation_server/db/migrations/053-add_accounts_users_templates_index.sql b/dictation_server/db/migrations/053-add_accounts_users_templates_index.sql new file mode 100644 index 0000000..5b4a4a6 --- /dev/null +++ b/dictation_server/db/migrations/053-add_accounts_users_templates_index.sql @@ -0,0 +1,19 @@ +-- +migrate Up +ALTER TABLE `accounts` ADD INDEX `idx_accounts_tier` (tier); +ALTER TABLE `accounts` ADD INDEX `idx_accounts_parent_account_id` (parent_account_id); +ALTER TABLE `users` ADD INDEX `idx_users_external_id` (external_id); +ALTER TABLE `users` ADD INDEX `idx_users_email_verified` (email_verified); +ALTER TABLE `licenses` ADD INDEX `idx_licenses_order_id` (order_id); +ALTER TABLE `licenses` ADD INDEX `idx_licenses_status` (status); +ALTER TABLE `template_files` ADD INDEX `idx_template_files_account_id` (account_id); +ALTER TABLE `template_files` ADD INDEX `idx_template_files_file_name` (file_name(500)); + +-- +migrate Down +ALTER TABLE `accounts` DROP INDEX `idx_accounts_tier`; +ALTER TABLE `accounts` DROP INDEX `idx_accounts_parent_account_id`; +ALTER TABLE `users` DROP INDEX `idx_users_external_id`; +ALTER TABLE `users` DROP INDEX `idx_users_email_verified`; +ALTER TABLE `licenses` DROP INDEX `idx_licenses_order_id`; +ALTER TABLE `licenses` DROP INDEX `idx_licenses_status`; +ALTER TABLE `template_files` DROP INDEX `idx_template_files_account_id`; +ALTER TABLE `template_files` DROP INDEX `idx_template_files_file_name`; \ No newline at end of file diff --git a/dictation_server/src/repositories/accounts/accounts.repository.service.ts b/dictation_server/src/repositories/accounts/accounts.repository.service.ts index 6d7c758..2832672 100644 --- a/dictation_server/src/repositories/accounts/accounts.repository.service.ts +++ b/dictation_server/src/repositories/accounts/accounts.repository.service.ts @@ -821,6 +821,7 @@ export class AccountsRepositoryService { status: Not(LICENSE_ALLOCATED_STATUS.UNALLOCATED), }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); // 存在した場合エラー @@ -1023,6 +1024,7 @@ export class AccountsRepositoryService { email_verified: true, }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); if (!primaryAdminUser) { throw new AdminUserNotFoundError( @@ -1040,6 +1042,7 @@ export class AccountsRepositoryService { email_verified: true, }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); if (!secondryAdminUser) { throw new AdminUserNotFoundError( diff --git a/dictation_server/src/repositories/licenses/licenses.repository.service.ts b/dictation_server/src/repositories/licenses/licenses.repository.service.ts index 5aeb576..a5e03a3 100644 --- a/dictation_server/src/repositories/licenses/licenses.repository.service.ts +++ b/dictation_server/src/repositories/licenses/licenses.repository.service.ts @@ -12,7 +12,6 @@ import { LICENSE_ALLOCATED_STATUS, LICENSE_ISSUE_STATUS, LICENSE_TYPE, - NODE_ENV_TEST, SWITCH_FROM_TYPE, TIERS, USER_LICENSE_STATUS, @@ -423,10 +422,7 @@ export class LicensesRepositoryService { po_number: poNumber, }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, - // テスト環境の場合はロックを行わない(sqliteがlockに対応していないため) - ...(process.env.NODE_ENV !== NODE_ENV_TEST - ? { lock: { mode: 'pessimistic_write' } } - : {}), + lock: { mode: 'pessimistic_write' }, }); if (!issuingOrder) { // 注文が存在しない場合、エラー @@ -570,6 +566,7 @@ export class LicensesRepositoryService { id: newLicenseId, }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); // ライセンスが存在しない場合はエラー diff --git a/dictation_server/src/repositories/template_files/template_files.repository.service.ts b/dictation_server/src/repositories/template_files/template_files.repository.service.ts index e3d3319..5fc805b 100644 --- a/dictation_server/src/repositories/template_files/template_files.repository.service.ts +++ b/dictation_server/src/repositories/template_files/template_files.repository.service.ts @@ -52,6 +52,7 @@ export class TemplateFilesRepositoryService { const template = await templateFilesRepo.findOne({ where: { account_id: accountId, file_name: fileName }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); // 同名ファイルは同じものとして扱うため、すでにファイルがあれば更新(更新日時の履歴を残しておきたい) diff --git a/dictation_server/src/repositories/users/users.repository.service.ts b/dictation_server/src/repositories/users/users.repository.service.ts index ae3fccc..8c39441 100644 --- a/dictation_server/src/repositories/users/users.repository.service.ts +++ b/dictation_server/src/repositories/users/users.repository.service.ts @@ -289,6 +289,7 @@ export class UsersRepositoryService { const targetUser = await repo.findOne({ where: { id: id, account_id: accountId }, comment: `${context.getTrackingId()}_${new Date().toUTCString()}`, + lock: { mode: 'pessimistic_write' }, }); // 運用上ユーザがいないことはあり得ないが、プログラム上発生しうるのでエラーとして処理