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 ...
随机推荐
- Linux 下的 python 虚拟环境 + vim快捷方式
day04虚拟环境 https://www.cnblogs.com/pyyu/p/9015317.html 博客 关闭防火墙: systemctl stop firewalld # 关闭防火前 sys ...
- 查看redis连接数
在redis-cli命令行使用:info clients可以查看当前的redis连接数. 如下图: config get maxclients 可以查询redis允许的最大连接数. 如下图:
- Navicat Premium 12.1.16.0安装与激活
声明:本文所提供的所有软件均来自于互联网,仅供个人研究和学习使用,请勿用于商业用途,下载后请于24小时内删除,请支持正版! 本文介绍Navicat Premium 12的安装.激活与基本使用.已于20 ...
- 安装sql server2017出现错误:Visual Studio 运行时"Microsoft visual c++2017 X64 Minimum Runtime - 14.10.25008"需要修复
安装sql server 2017 Developer Edition时,安装选择“基本”,发生如下错误: 解决方法: 1.进入控制面板→程序中,找到“Microsoft visual c++2017 ...
- 设置tomcat开机自启和后台运行
前言:程序登录遇到了问题,重启服务器上的tomcat后程序可以正常的使用,是通过进入bin目录,双击startup.bat运行启动的程序,此时会弹出启动窗口,而且该窗口不能关闭,这个窗口是tomcat ...
- cocos 场景制作流程
前面的话 本文将详细介绍 cocos 场景制作流程 节点和组件 Cocos Creator 的工作流程是以组件式开发为核心的,组件式架构也称作组件-实体系统,简单的说,就是以组合而非继承的方式进行实体 ...
- Vjudge Code
Stylus @-moz-document url-prefix("https://cn.vjudge.net/"), url-prefix("https://vjudg ...
- [洛谷P1650] 田忌赛马
贪心难题:总结贪心问题的一般思路 传送门:$>here<$ 题意 田忌和齐王各有n匹马,赛马时一一对应.赢+200,输-200,平+0. 问最多多少钱? 数据范围:$n \leq 2000 ...
- BZOJ2127Happiness
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- CF802C Heidi and Library (hard)
题目描述 你有一个容量为k的空书架,现在共有n个请求,每个请求给定一本书ai,如果你的书架里没有这本书,你就必须以ci的价格购买这本书放入书架.当然,你可以在任何时候丢掉书架里的某本书.请求出完成这n ...