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 ...
随机推荐
- 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)
为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...
- HTML基础-------最初概念以及相关语法
HTML概念以及相关语法 HTML HTML是一种类似于(c,java,c++)之类的语言,他是用来描述网页的一种语言.通过各种标签所代表的语义来构建出一个网页,再通过浏览器的渲染功能来实现该网页的各 ...
- Linux:Day20(上) openssh和CA
ssh:secure shell protocol,22/tcp,安全的远程登陆 OpenSSH:ssh协议的开源实现: dripbear:另一个开源实现: SSH协议版本 v1:基于CRC-32做M ...
- mybatis insertUseGeneratedKeys 返回主键为null
package tk.mybatis.mapper.common.special; import org.apache.ibatis.annotations.InsertProvider; impor ...
- django drf json格式化日期时间带T的问题 基于python的解决方法
# models.py update_time = models.DateTimeField(verbose_name=u'更新时间', default=timezone.now) 问题:天 与 小时 ...
- Day11 空时编码理论之正交空时分组码和垂直分层空时编码
空时编码的用途: 一是获得分集增益(STBC,通过不同的发射天线发送相同传输信号的不同副本,实现空间分集,提高传输质量): 二是获得复用增益(V-BLAST在同一时隙,将不同的符号通过不同的天线发射出 ...
- Python——Pyqt5(界面)——基本设置
一.Pycharm外加设置 设置扩展工具 1.Qt Design(图形界面) Program:工程目录\venv\Lib\site-packages\pyqt5-tools\designer.exe ...
- CSS绝对定位元素居中的几种方法
转载自-CSS居中绝对https://www.cnblogs.com/skura23/p/6530556.html 作者:PajamaCat 1,div宽度未知1 <body> <d ...
- Singleton多种实现方式的在多线程情况下的优缺点
一.饿汉式 缺点:不能懒加载 // 不能懒加载 public class SingletonObject1 { private static final SingletonObject1 instan ...
- BIZ中model.getSql源码分析
功能:根据model.xml文件中配置的sql,获取对应的动态sql结果. 实例代码:String sql1 = model.getSql(dao.dbMeta());String sql2 = mo ...