Table des matières
回复内容:
Maison développement back-end tutoriel php 关于数据库锁机制

关于数据库锁机制

Jul 06, 2016 pm 01:53 PM
mysql php

1.数据库是如何加锁的,简单的sql语句
SELECT username,passwd FROM g_test LIMIT 1 FOR UPDATE
正常的查询后加上FOR UPDATE 就是给数据库加锁了么?
2.加上FOR UPDATE是对写加锁,这个语句是否对DELETE生效?
3.MYISAM加锁是全表锁?
4.InnoDB是行锁?

新加问题

5.如果数据库开启了事务并加了锁,由于某些原因后续操作未进行彻底,没有commit或rollback,事务是否有超时机制?锁是否有超时机制?到期自动销毁

回复内容:

1.数据库是如何加锁的,简单的sql语句
SELECT username,passwd FROM g_test LIMIT 1 FOR UPDATE
正常的查询后加上FOR UPDATE 就是给数据库加锁了么?
2.加上FOR UPDATE是对写加锁,这个语句是否对DELETE生效?
3.MYISAM加锁是全表锁?
4.InnoDB是行锁?

新加问题

5.如果数据库开启了事务并加了锁,由于某些原因后续操作未进行彻底,没有commit或rollback,事务是否有超时机制?锁是否有超时机制?到期自动销毁

其他答主说的不够全面,我帮你整理一下吧。
首先我认为在谈到数据库各种机制前(尤其是MySQL这种插件式plugin存储引擎的数据库),你一定要声明你使用的存储引擎,不然问题无意义,此处我假定你的第1、2条问题是基于innoDB存储引擎下的,并且我的理论也是基于innoDB引擎。
明确概念,锁分为两种:
读锁->共享锁 (S)
写锁 -> 排它锁 (X)
写操作的为排它锁,读操作的为排它锁,
理论上来说只要被操作对象(例如 id =1这行)出现排它锁,那么除了该事务可以操作这行,其余事务全部无权对这行进行任何操作,无论是读操作还是写操作

对了,selct .. for update并不属于SQL规范,所以实际上应该避免使用。
select ..for update 是进行排它锁操作的,但是这条语句在事务中才有意义,因为在非事务情况下使用,一下子就完成了锁定与解锁的操作,无任何实际意义。
还有一点很重要的是innoDB在隔离级别为REPEATABLE READ和READ COMMITTED的事务操作中,并没有直接使用行级锁,而是使用了乐观机制MVCC,即大多数的读操作都不用加锁,即使是写锁也只是锁必要的行《了解MVCC》

回到你的问题:
1、“SELECT username,passwd FROM g_test LIMIT 1 FOR UPDATE” 是否加锁了?

是的,加了一个行级排它锁。

2、“for update写加锁是否对delete语句有效?”

加上for update是一个写锁(即排它锁),它对delete当然有效(delete无法操作),但还是上面的观点,在REPEATABLE READ和READ COMMITTED的事务操作中,使用了MVCC,所以你可以惊奇的发现即使用了for update这条排它锁语句后,其他事务依旧可以进行读操作。

3、“MyISAM加锁是全表锁吗?”

对的,MyISAM存储引擎只有表级锁(table-level locking)

4、“innoDB是行级锁?”

不全对,innoDB具有行级锁和表级锁,但它默认是行级锁。

5、“事务和锁是否有超时机制”

事务本身是没有超时机制的,但是如果事务是由于锁表而造成的超时原因,是会进行回滚操作。innodb默认锁超时时间为50秒,通过设置变量innodb_lock_wait_timeout来实现。

MYISAM加锁是对整张表的;InnoDB加锁是行锁,针对一行记录
SELECT username,passwd FROM g_test LIMIT 1 FOR UPDATE就是防止多个进程过来同时执行sql查询,加上FOR UPDATE的话,会被锁定,这样另一个进程过来就会排队等待,直到上一个进程执行完毕;也就是并发
最重要的一点是,加锁,要放到事务中去,即执行sql执行先开启事务。

InnoDB 采用的是两阶段锁定协议(two-phase locking protocol)。在事务执行过程中,随时都可执行锁定。锁只有在执行 commit 或 rollback 时才会释放,并且所有的锁是在同一时刻被释放。InnoDB会根据隔离级别在需要时自动加锁。此为隐式锁定;
InnoDB 也支持通过特定语句进行显式锁定:
select ... lock in share mode (shared lock)
select ... for update (exclusive lock)
另外 MySQL在服务器层也支持lock tables 和 unlock tables 语句,这和存储引擎无关。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

MySQL: la facilité de gestion des données pour les débutants MySQL: la facilité de gestion des données pour les débutants Apr 09, 2025 am 12:07 AM

MySQL convient aux débutants car il est simple à installer, puissant et facile à gérer les données. 1. Installation et configuration simples, adaptées à une variété de systèmes d'exploitation. 2. Prise en charge des opérations de base telles que la création de bases de données et de tables, d'insertion, d'interrogation, de mise à jour et de suppression de données. 3. Fournir des fonctions avancées telles que les opérations de jointure et les sous-questionnaires. 4. Les performances peuvent être améliorées par l'indexation, l'optimisation des requêtes et le partitionnement de la table. 5. Prise en charge des mesures de sauvegarde, de récupération et de sécurité pour garantir la sécurité et la cohérence des données.

Comment créer Navicat Premium Comment créer Navicat Premium Apr 09, 2025 am 07:09 AM

Créez une base de données à l'aide de NAVICAT Premium: Connectez-vous au serveur de base de données et entrez les paramètres de connexion. Cliquez avec le bouton droit sur le serveur et sélectionnez Créer une base de données. Entrez le nom de la nouvelle base de données et le jeu de caractères spécifié et la collation. Connectez-vous à la nouvelle base de données et créez le tableau dans le navigateur d'objet. Cliquez avec le bouton droit sur le tableau et sélectionnez Insérer des données pour insérer les données.

MySQL: Concepts simples pour l'apprentissage facile MySQL: Concepts simples pour l'apprentissage facile Apr 10, 2025 am 09:29 AM

MySQL est un système de gestion de base de données relationnel open source. 1) Créez une base de données et des tables: utilisez les commandes CreateDatabase et CreateTable. 2) Opérations de base: insérer, mettre à jour, supprimer et sélectionner. 3) Opérations avancées: jointure, sous-requête et traitement des transactions. 4) Compétences de débogage: vérifiez la syntaxe, le type de données et les autorisations. 5) Suggestions d'optimisation: utilisez des index, évitez de sélectionner * et utilisez les transactions.

Comment exécuter SQL dans Navicat Comment exécuter SQL dans Navicat Apr 08, 2025 pm 11:42 PM

Étapes pour effectuer SQL dans NAVICAT: Connectez-vous à la base de données. Créez une fenêtre d'éditeur SQL. Écrivez des requêtes ou des scripts SQL. Cliquez sur le bouton Exécuter pour exécuter une requête ou un script. Affichez les résultats (si la requête est exécutée).

Comment créer une nouvelle connexion à MySQL dans Navicat Comment créer une nouvelle connexion à MySQL dans Navicat Apr 09, 2025 am 07:21 AM

Vous pouvez créer une nouvelle connexion MySQL dans NAVICAT en suivant les étapes: ouvrez l'application et sélectionnez une nouvelle connexion (CTRL N). Sélectionnez "MySQL" comme type de connexion. Entrez l'adresse Hostname / IP, le port, le nom d'utilisateur et le mot de passe. (Facultatif) Configurer les options avancées. Enregistrez la connexion et entrez le nom de la connexion.

L'avenir de PHP: adaptations et innovations L'avenir de PHP: adaptations et innovations Apr 11, 2025 am 12:01 AM

L'avenir de PHP sera réalisé en s'adaptant aux nouvelles tendances technologiques et en introduisant des fonctionnalités innovantes: 1) s'adapter aux architectures de cloud computing, de conteneurisation et de microservice, en prenant en charge Docker et Kubernetes; 2) introduire des compilateurs JIT et des types d'énumération pour améliorer l'efficacité des performances et du traitement des données; 3) Optimiser en continu les performances et promouvoir les meilleures pratiques.

Navicat ne peut pas se connecter à MySQL / MARIADB / POSTRESQL et à d'autres bases de données Navicat ne peut pas se connecter à MySQL / MARIADB / POSTRESQL et à d'autres bases de données Apr 08, 2025 pm 11:00 PM

Raisons courantes pour lesquelles Navicat ne peut pas se connecter à la base de données et à ses solutions: 1. Vérifiez l'état d'exécution du serveur; 2. Vérifiez les informations de connexion; 3. Réglez les paramètres du pare-feu; 4. Configurer l'accès à distance; 5. Dépannage des problèmes de réseau; 6. Vérifier les autorisations; 7. Assurer la compatibilité de la version; 8. Dépannage d'autres possibilités.

Navicat se connecte au code et à la solution d'erreur de base de données Navicat se connecte au code et à la solution d'erreur de base de données Apr 08, 2025 pm 11:06 PM

Erreurs et solutions courantes Lors de la connexion aux bases de données: nom d'utilisateur ou mot de passe (erreur 1045) Blocs de pare-feu Connexion (erreur 2003) Délai de connexion (erreur 10060) Impossible d'utiliser la connexion à socket (erreur 1042) Erreur de connexion SSL (erreur 10055) Trop de connexions Résultat de l'hôte étant bloqué (erreur 1129)

See all articles