簡體   English   中英

Yii2 唯一驗證器在插入如此之快時不起作用

[英]Yii2 Unique Validator not working when insert so fast

我正在使用 ActiveRecord 模型來保存數據。

Unique Validator工作得非常完美。 但是當我如此快速地插入數據時,它不再完美地工作。 在某些請求中,我收到 Yii 無法捕獲的錯誤。

違反完整性約束– yii\\db\\IntegrityException SQLSTATE[23000]: 違反完整性約束:1062 重復條目 '***'...

我們是否有任何解決方案可以在不添加其他服務的情況下處理此問題?

謝謝 !

在評論中總結...

您最有可能需要的是在驗證之前手動鎖定表並在之后釋放鎖定。 Yii2 提供了樂觀鎖機制,但它不適合您的情況 樂觀鎖僅在 update 和 delete 方法中受支持:

僅當您分別使用 yii\\db\\ActiveRecord::update() 或 yii\\db\\ActiveRecord::delete() 更新或刪除現有數據行時,才支持樂觀鎖定。

此外,樂觀鎖只是在更新因沖突而失敗時引發異常(沒有實際的表鎖定)。

解決方案將取決於您的數據庫引擎。 Yii2 提供了手動鎖定的互斥機制。 開箱即用的 Yii2 支持 Mysql 和 Postgres。 請參閱 Yii2 手冊以下頁面的組件說明:

因此,在配置中配置互斥鎖之后(來自官方指南的 pgsql 示例):

[
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'pgsql:host=127.0.0.1;dbname=demo',
        ]
        'mutex' => [
            'class' => 'yii\mutex\PgsqlMutex',
        ],
    ],
]

你需要做這樣的事情

\Yii::$app->mutex->acquireLock($lockingObject);

// validate uniqueness and save

\Yii::$app->mutex->releaseLock($lockingObject);

或者,您可以使用 RDBMS 的 SQL 語法手動執行此操作。

MySQL

SELECT GET_LOCK('tablename',10);
SELECT RELEASE_LOCK('tablename');

查詢語句

LOCK TABLE tablename IN SHARE ROW EXCLUSIVE MODE;

請注意,Pgsql 鎖僅在事務內部起作用。

  • Unique Validator在這種情況下不起作用

我對這個問題的解決方案(防止重復插入):

  • 我使用MySQL UNIQUE IndexINSERT IGNORE來忽略新記錄(如果存在)。 它易於實施。 它的工作速度非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM