mysql 共享锁 死锁 STM32表记录发货记录表

根据锁的范围

根据锁定原因

全局锁定

锁对象为:整个数据库实例

Flush with read lock (FTWRL)-将使整个库只读

使用场景:做整个库的逻辑备份

全库逻辑备份

为什么数据备份需要全局锁?

比如对于销售,我用一米记录发货,记录扣费。因此,我正在备份发货记录表。这时有人买了东西,只扣了货款,没有发货记录。这显然行不通

官方自带的逻辑备份工具是。当使用参数—时,会在导入数据之前启动一个事务,以确保获得一致的视图。得益于MVCC的支持,在此过程中数据可以正常更新。但是这个是基于事务的,对于数据引擎来说是不可用的,那么有可能有些表不是基于数据引擎的

当然,如果都是数据引擎表,那么最好使用默认的增加参数—进行全局逻辑备份。

FTWRL和set=true的区别会用到其他逻辑中(不同系统不同)ftwrl可以在客户端连接断开时自动释放锁。防止死锁问题

表级锁

命令:lock table {) read/write(写比读强,能写当然能读),表解锁

被锁定的资源只允许当前线程执行相应的操作。而当前线程只能对锁定的表进行相应的操作

例如:锁表t1读,当前线程只能读不能写,其他线程不能读不能写

MDL 锁

无需显式使用,访问表时自动添加(为了防止表结构变化引起的问题)

增加、删除、修改、检查表时MDL读锁,改变表结构时MDL写锁

行锁

行锁是引擎层,由各个引擎自己实现(不支持行锁,所以引擎一次只能操作一个线程)

在事务中:当需要使用哪一行数据时会加行锁,但事务提交后会释放所有行锁。也就是说,其他线程需要访问改变的行数据,需要等待线程。仅在交易提交后访问示例:

线程A执行以下操作
begin;
update t1 set a=1 where id=1;
​
update t2 set b=2 where id=2;
​
commit
​
这个时候线程A分别对t1的id=1上锁和t2的id=2上锁.如果此时线程B访问t1的id=1是无法访问的,即使第一条语句已经执行完成了
线程B只有在线程A进行了commit操作之后才能获取其中的数据

所以,我们需要注意的一点是:在进行事务操作的时候mysql 共享锁 死锁,如果没有顺序操作,那么尽量最后执行访问最多的语句(因为锁是顺序的,但是释放的锁是一起发布)

死锁

导致死锁的情况很多,其中大部分是数据库操作问题引起的。例如

线程A和线程B都针对id=1和id=2进行修改并开启事务
​
线程A先修改了id=1导致id=1被线程A上锁
​
线程B修改了id=2导致id=2被县城B上锁
​
此时线程A要等待id=2释放锁后执行对id=2的操作
而线程B要等待id=1释放锁后怼id=1的操作
​
从而达到了一个循环死锁的情况

有两种策略可以解决这个问题:

直接进入等待,直到超时。这个超时时间可以通过参数 eout 设置(默认 50s)。这个不能设置太短,如果不是死锁怎么办?启动死锁检测,当发现死锁时,主动回滚死锁链中的某个事务,以便其他事务可以继续执行。将参数ct设置为on(默认为on),表示开启该逻辑。乐观锁和悲观锁概念乐观锁悲观锁

区别

假设不会发生并发冲突

只在提交时判断是否有数据问题

假设会发生并发冲突

然后把它锁起来

实施层面

在业务代码层面,自己实现

mysql数据库本身的实现

并发情况

高并发

小并发

实现方法

在数据库中添加版本号字段mysql 共享锁 死锁

提交时判断操作前的版本号与当前版本号是否一致

共享锁:锁

独占锁:xxxx for

其他

Mysql其实就是排他锁

共享锁:运行其他线程。 `检查`不允许`增删改查`排他锁:`不允许增删改查`

向《极客时光》学习,欢迎原作者学习,本文仅为学习记录

文章来源:https://zhuanlan.zhihu.com/p/410679024

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享