mysql并发控制之数据库锁
1.mysql和redis的区别
mysql是一种关系型数据库,数据会最终存储在磁盘上。而redis是一种非关系型的nosql数据库,以key-value的形式存储数据,将数据存储在内存。从性能上来说,redis将数据存储在内存,性
能肯定要优于mysql数据库。但是从安全的角度来说,mysql数据存储在磁盘上更安全些。所以我们在项目中一般会将redis和mysql结合使用。
2.redis的事物
redis事物执行过程说明:redis对事物的支持比较简单,能够保证一个客户端发起的多个命令可以被连续的执行。我们清楚,在redis中和事物相关的关键字有multi(表示开启一个事物),
exec(表示执行一个事物),discard(表示回滚一个事物)。在一般情况下(没有开启事物),redis的client端发起一个命令到redis的server端,命令会直接执行并将结果返回给client。但是
当我们使用multi开启一个事物时,client每发出一个操作,server端会将这个命令放入到一个队列里面,直到客户端发出exec提交命令时,server端会将这些命令一次执行。并将执行的结果打包
发送到client,结束这个事物的执行。
我们清楚关系型数据库mysql的事物一般支持ACID,即原子性,一致性,隔离性,持久性原则,但是在redis中,这些原则并不都支持。
原子性:在上面的分析中,我们已经清楚,一个client端执行multi命令开启一个事物,会进入到一个事物的上下文,之后所有的命令会被放到执行队列,直到发出exec命令后,server端会依次
执行这些命令并将执行结果返回,并且释放上下文。但是在这里面有一个问题,就是当队列中有一个命令出现错误时,并不会发生回滚,而是会继续执行后面的命令。这就违背了事物的原子性原
则。这是redis事物存在的第一个问题。
一致性:
隔离性:redis在执行一个事物队列中的命令时,其它的client是无法执行命令的,所以它满足了隔离性。
持久性:通过前面对事物的分析,我们已经清楚redis的事物只不过是执行队列中存储的一系列的命令,执行完成之后数据依然存储在内存。它的持久性其实与事物并没有多大的关系,而是与我
们所设定的redsi的持久化方案有关。当我们没有启用redis的持久化时,所有数据都是存储在内存,当然不存在持久性。当我们使用rdb模式的持久化方案时,如果在redis事物执行完成之后到执
行rdb文件更新这段时间服务器出现问题,事物提交的数据的持久性也无法得到保证。当我们使用aof模式的持久化方案时,命令的执行由主线程来完成,持久化由后台线程来完成,但是主线程不
会阻塞等待后台线程完成任务后在执行,中间出现时间差,所以也不一定会保证持久性。
redis事物存在的问题:
1.无法满足原子性,队列中某条命令执行错误时,并不会回滚,而是会继续执行下面的命令。
2.假如我们在一个事物执行之前查询出一个key,然后在这个事物中对这个key执行加1的操作。但是我们在事物提交(exec)之前某个客户端对这个key做了修改,由此我们就无法达到我们的要
求。redis在这块所做的努力是引入watch机制,我们在获取key之前,对这个key执行watch命令,然后执行事物中,只要这个key发生任何的变化,这个事物不会执行成功。
mysql并发控制之数据库锁的更多相关文章
- MySQL 事物和数据库锁
1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...
- 【数据库】mysql深入理解乐观锁与悲观锁
转载:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时 ...
- [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]
[MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...
- MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...
- mysql的事务和数据库锁的关系
数据库加事务并不是数据就安全来了,事务和锁要分析清楚和配合使用 问题背景处于对高并发的秒杀环节的理解整理如下: 秒杀的时候高并发主要注意1.在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成 ...
- MySQL数据库锁类型
锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 一个栗子 :以买火车票为例,火车票可面向广大消 ...
- 【MySQL】锁——查看当前数据库锁请求的三种方法 20
MySQL提供了查看当前数据库锁请求的三种方法:1. show full processlist命令 观察state和info列 2. show engine innodb status\G ...
- 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...
- 看MySQL的参数调优及数据库锁实践有这一篇足够了
史上最强MySQL参数调优及数据库锁实践 1. 应用优化 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL ...
随机推荐
- 英语-TOEFL和GRE复习计划与资料
目录 一. TOEFL (1). 阅读: 60 minutes (2). 听力: 50 minutes (3). 口语: 20 minutes (4). 作文: 60 minutes 单词准备 其他资 ...
- vue 利用mockJs 模拟数据
工作这几年一直用Java 开发,前端的技术自己也忘得差不多了(实际上自己也不怎么会),最近参与的项目是用VUE + Element-ui + springboot 写的,由于需求没有定,先画一个de ...
- python day07
数据类型之间的相互转换 1.字符串转换成数字类型 判断哪些可以转换成数字型可以参考下面例题: # 判断实现将所有能转换为数字类型的字符串都转换为对应类型的数字# int: '10' = > 10 ...
- 类StringBuilder
StringBuilder概述 因为字符串的底层是一个被final修饰的数组,不能改变,是一个常量.所以每当进行字符串拼接时,总是会在内存中创建一个新的对象.由此可知,如果对字符串进行拼接操作,每次拼 ...
- Android Studio3.x上使用Lombok
1.添加gradle依赖 implementation 'org.projectlombok:lombok:1.16.8' //添加lombok依赖implementation 'org.glassf ...
- ABP实践(2)-ASP.NET Core 2.x版本EntityFrameworkCore(EF)使用mysql数据库
上一篇中EntityFrameworkCore默认使用的是微软的sql server,本篇改为mysql步骤如下: 1,在基础层xxx.EntityFrameworkCore依赖项添加Pomelo.E ...
- DAY21、面向对象
一.内存管理与正则语法1.内存管理:引用计数:垃圾回收机制工作原理 引用就 +1 ,释放就 -1 ,当计数为0时,就会被垃圾回收机制回收标记清除:解决循环导入引用导致的内存泄漏 标记:GC roots ...
- c提高第四课
1.一维数组的初始化 , , }; //3个元素 ] = { , , }; //a[3], a[4]自动初始化为0 ] = { }; //全部元素初始化为0 memset(c, , sizeof(c) ...
- springboot启动关闭脚本
springboot项目jar包启动,application.properties.jar包.shell脚本.static目录(静态页面和jar包分离)在同一目录下 [start.sh] #!/bin ...
- 快速排序-python