ホームページ  >  記事  >  データベース  >  MySQL で悲観的ロックと楽観的ロックを適用する方法

MySQL で悲観的ロックと楽観的ロックを適用する方法

PHPz
PHPz転載
2023-06-02 21:27:591250ブラウズ

1. 鍵

生活の中で: 鍵は私たちの周りのいたるところにあります。たとえば、遊びに行くとき、ドアに鍵をかける必要があります。たとえば、金庫にお金を入れる必要があるときなどです。 , 私の財産のセキュリティを確保するためにロックする必要があります。

コード内: たとえば、複数のスレッドが共有変数を同時に操作および変更する必要がある場合、変数値が正しいことを確認するために変数をロック (同期) する必要があります。

データベース テーブル: 複数のユーザーがテーブル内の同じデータを変更する場合、行データをロックすることができます (行ロック)。

sql script

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `deleted` tinyint(1) DEFAULT NULL COMMENT '是否删除',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人',
  `update_id` bigint(20) DEFAULT NULL COMMENT '操作人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `status` varchar(255) DEFAULT NULL COMMENT '状态',
  `dog` text DEFAULT NULL COMMENT '狗',
  `version` int(11) DEFAULT NULL COMMENT '版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sys_user`(`id`, `name`, `age`, `email`, `deleted`, `create_time`, `create_id`, `update_id`, `update_time`, `status`, `dog`, `version`) VALUES (1, 'gukong', 19, 'test1@baomidou.com', 0, NULL, NULL, NULL, NULL, NULL, NULL, 0);

2. 悲観的ロック

他の人が同時に変更されるのを避けるために、データベース内のデータを変更する場合解決策は、同時実行を防ぐためにデータを直接ロックすることです。

悲観的ロックは、他のスレッドによってデータが変更されることを前提として、データが変更されたときにロック操作を実行する悲観的な同時実行制御方式を採用しているため、悲観的ロックと呼ばれます。一般に、データが同時に変更される可能性は比較的高いため、変更前にデータをロックする必要があると考えられます。

データベース内の行ロック、テーブル ロック、読み取りロック、書き込みロック、および同期ロックはすべて悲観的ロックです。

mysql は悲観的ロックをオンにします (SQL ステートメントの例)

--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'gukong',age = 18 where id = 1;
--提交事务
commit;
--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'kulilin',age = 20 where id = 1;
--提交事务
commit;
update sys_user set name = 'kulilin',age = 20 where id = 1;

MySQL で悲観的ロックと楽観的ロックを適用する方法

3. 楽観的ロック

楽観的ロックは、データの競合に関する楽観的な考え方を維持することです。データを操作する際には、操作したデータはロックされず、データが送信された場合にのみデータに矛盾がないか検証する仕組みを採用するという姿勢。

オプティミスティックロックは通常、テーブルにバージョン(version)またはタイムスタンプ(タイムスタンプ)を追加することで実装されますが、このうち最もよく使われるのはバージョンです。

オプティミスティック ロックは、データ変更操作を実行するたびにバージョン番号を取得します。バージョン番号がデータのバージョン番号と一致すると、変更操作を実行し、バージョン番号に対して 1 つの操作を実行できます。そうでない場合は、変更操作を実行して、バージョン番号に対して 1 つの操作を実行できます。実行は失敗します。

オプティミスティック ロックの例:

-- version = 0
SELECT * FROM `sys_user` where id = 1 
update sys_user set name='小明',version = version+1 and age = 20 where id = 1 and version = 0;
-- version = 0 ,而此时version=1,更新失败
SELECT * FROM `sys_user` where id = 1 
update sys_user set name = '小红' version = version+1 and age = 25 where id = 1 and version = 0;

MySQL で悲観的ロックと楽観的ロックを適用する方法

4. 選択方法

オプティミスティック ロックは、読み取りが多く書き込みが少ないシナリオに適しています。および省略可能 ロックを頻繁にロックおよび解放することによるオーバーヘッドにより、スループットが向上します。

頻繁な書き込み操作が必要な場合、オプティミスティック ロックを使用すると、大量のスピンが発生し、CPU を消費し、パフォーマンスに影響を与える可能性があります。バージョンが一貫していないため、再試行が継続されます。この場合、悲観的ロックが適しています

以上がMySQL で悲観的ロックと楽観的ロックを適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。