一小时搞懂Mysql锁机制

本文详细介绍了MySQL的锁机制,包括表锁、行锁、共享锁、排它锁、意向锁、乐观锁、悲观锁、间歇锁、记录锁和临键锁,以及死锁的概念和处理方式,帮助读者全面掌握数据库并发访问一致性与有效性的保证措施。
摘要由CSDN通过智能技术生成

内容概述: 

我们知道,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素。从这一角度来说,锁对于数据库而言就显得尤为重要。接下来我们了解各种锁的特征。

1.1 表锁

表级锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好地避免困扰我们的死锁问题。InnoDB支持表级锁。但是默认的行锁,而且只有在查询或者其他SQL语句通过索引才会使用行锁。

1.2 行锁

行锁的是mysql锁中粒度最小的一种锁,因为锁的粒度很小,所以发生资源争抢的概率也最小,并发性能最大,但是也会造成死锁,每次加锁和释放锁的开销也会变大。目前主要是Innodb使用行锁。根据使用方式也分为共享锁(S锁或者读锁)和排它锁(X锁或者写锁)。

1.3共享锁(读锁,S锁)

共享锁的具体逻辑如下案例:

若事务A对数据对象o加上S锁,则事务A可以读数据对象o但不能修改,其他事务只能再对数据对象o加S锁,而不能加X锁,直到事务A释放数据对象o上的S锁。这保证了其他事务可以读数据对象o,但在事务A释放数据对象o上的S锁之前不能对数据对象o做任何修改。

语法和案例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

# 加读锁

 Lock table tablename read;

#释放锁

unlock table;

案例如下 :

#session1 给表创建读锁(创建一个连接就是一个回话session)

mysql> lock table userinfo read;

Query OK, 0 rows affected (0.01 sec)

#可以读取当前表的数据

mysql> select from userinfo ;

+----+----------+------+

| id | name     | age  |

+----+----------+------+

|  1 | zhangsan |   27 |

|  2 | lisi     |   27 |

|  3 | dd       | NULL |

|  4 | dd       |    2 |

+----+----------+------+

rows in set (0.00 sec)

#session1  因为给userinfo表加了读锁,所以不能读取其他表数据

mysql> select from student_score;

ERROR 1100 (HY000): Table 'student_score' was not locked with LOCK TABLES

#session1  因为给表加的读锁,所以当前回话不能对表进行其他操作,

mysql> update userinfo set age=age+1;

ERROR 1099 (HY000): Table 'userinfo' was locked with READ lock and can't be updated

  

#session2,在session1 没有释放锁之前,session2可以进行读取userinfo

mysql> select * from userinfo;

+----+----------+------+

| id | name     | age  |

+----+----------+------+

|  1 | zhangsan |   27 |

|  2 | lisi     |   27 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值