Метод sharedLock
Метод sharedLock применяется к запросу Eloquent или Query Builder и устанавливает разделяемую блокировку на выбираемые записи. Это означает, что другие транзакции могут читать эти записи, но не могут изменять их до снятия блокировки. Метод не принимает параметров и возвращает тот же запрос с добавленным условием блокировки.
Синтаксис
<?php
Model::sharedLock()->get();
?>
Пример
Давайте заблокируем статью с идентификатором 1 для чтения в рамках транзакции:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::transaction(function () {
$article = Article::where('id', 1)
->sharedLock()
->first();
return $article ? $article->title : null;
});
echo $res;
}
}
?>
Результат выполнения кода:
"article title"
Пример
Давайте получим все статьи с разделяемой блокировкой в транзакции:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::transaction(function () {
$articles = Article::sharedLock()->get();
$titles = [];
foreach ($articles as $article) {
$titles[] = $article->title;
}
return $titles;
});
var_dump($res);
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3", "article 4", "article 5"]
Пример
Использование разделяемой блокировки с другими условиями выборки:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::transaction(function () {
$articles = Article::where('status', 'published')
->orderBy('id')
->sharedLock()
->get();
$titles = [];
foreach ($articles as $article) {
$titles[] = $article->title;
}
return $titles;
});
var_dump($res);
}
}
?>
Результат выполнения кода:
["article 2", "article 3", "article 5"]
Пример
Разделяемая блокировка в комбинации с методом lockForUpdate (будет использована разделяемая блокировка):
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::transaction(function () {
$article = Article::where('id', 1)
->sharedLock()
->lockForUpdate()
->first();
return $article ? $article->title : null;
});
echo $res;
}
}
?>
Результат выполнения кода:
"article title"
Смотрите также
-
метод
lockForUpdate,
который устанавливает монопольную блокировку для изменения -
метод
get,
который выполняет запрос и возвращает коллекцию -
метод
first,
который возвращает первую найденную запись -
метод
transaction,
который выполняет операции в транзакции базы данных