iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL和Redis事务的区别和用法
  • 960
分享到

MySQL和Redis事务的区别和用法

2024-04-02 19:04:59 960人浏览 独家记忆
摘要

本篇文章给大家主要讲的是关于Mysql和Redis事务的区别和用法的内容,感兴趣的话就一起来看看这篇文章吧,相信看完mysql和Redis事务的区别和用法对大家多少有点参考价值吧。   

本篇文章给大家主要讲的是关于MysqlRedis事务的区别和用法的内容,感兴趣的话就一起来看看这篇文章吧,相信看完mysql和Redis事务的区别和用法对大家多少有点参考价值吧。                                                          

Redis

[1] Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

操作错误

看着有点儿绕口,那就实际执行一下 看一下结果。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tr_1 233
QUEUED
127.0.0.1:6379> lpush tr_1 666
QUEUED
127.0.0.1:6379> set tr_2 888
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK

在上面的事务中,设置了一个 key 为 tr_1 的字符串数据,然后又通过 lpush 来添加元素,这很明显是错误的操作方式,当我们提交事务候出现了一个操作错误,这时候我们来看看 tr_1 的值是什么。

127.0.0.1:6379> get tr_1
"233"

通过 get 命令来的tr_1 内容还是 233 ,并没有变,那再看一下其他的。

127.0.0.1:6379> keys *
1) "tr_2"
2) "tr_1"
127.0.0.1:6379> get tr_2
"888"
127.0.0.1:6379>

这里可以看到 tr_2 存在,并打印了值,这时候我们发现,即使出现了操作错误 ,但是错误并没有致使执行停止,错误之后的语句也执行了并成功执行,似乎符合上面提到的 中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

语法错误

NO~,这时候还有另外一种情况 语法错误

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tr_1 233
QUEUED
127.0.0.1:6379> lpush tr_1 666
QUEUED
127.0.0.1:6379> set
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set 233
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set tr_2 888
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty list or set)

当我们执行到 set时没有给任何参数,第二次执行时故意少给了一个参数。可以看到报了 语法错误,最后提交事务,也告诉了我们事务因为错误被丢失了,接着用 keys *检索发现确实如此。

文档释义

这里可以官方文档中提到的

Errors inside a transaction

// 在执行过程中 可能会遇到两种错误命令错误。

During a transaction it is possible to encounter two kind of command errors:

// 1.命令无法进入队列 ,比如 :参数数量错误,命令名错误...,或者某些关键错误 如内存不足

  • A command may fail to be queued, so there may be an error before EXEC is called. For instance the command may be syntactically wrong (wrong number of arguments, wrong command name, ...), or there may be some critical condition like an out of memory condition (if the server is configured to have a memory limit using the maxmemorydirective).

// 2. 对键进行错误的操作 如上面的 对字符串使用 lpush

  • A command may fail after EXEC is called, for instance since we perfORMed an operation against a key with the wrong value (like calling a list operation against a string value).

// 客户端检查键入的命令,大多数时候会在调用 exec 前发现第一类错误,如果命令执行返回来 QUEUED 则表示命令正常进入队列,否则错误,大多数情况下客户端会终止放弃这个事务。

Clients used to sense the first kind of errors, happening before the EXEC call, by checking the return value of the queued command: if the command replies with QUEUED it was queued correctly, otherwise Redis returns an error. If there is an error while queueing a command, most clients will abort the transaction discarding it.

关于 Redis 暂时看到这里 接下来看到 Mysql

MySQL

众所周知,MySQL 只有 InnoDB 引擎支持 事务,在启用 MySQL 事务之前需要先停掉自动提交

测试表结构 user
类型注释
idint(11) 自动增量主键ID
moneyint(11) [0]金钱
titlevarchar(500) NULL称呼

在这里来模拟一个转账的操作:A给B转100元。

步骤解析 A+100 元,B -100元,即两步虽然很简单,简单走一下流程。

MySQL和Redis事务的区别和用法

可以看到,没有问题,那么我们从中人为的制造一些问题呢?

操作错误



类型注释
idint(11) 自动增量
moneyint(11) unsigned [0]
titlevarchar(500) NULL

这里我们把 money 字段变成了无符号,即不能小于 0,并且,调整数据库中的数据如下。

`SELECT * FROM `user` LIMIT 50` (0.000 秒)
修改idmoneytitle
编辑110000A
编辑20B

接着执行下面的 SQL

select version();
SET AUTOCOMMIT=0;
begin;
select * from user where title in ('A','B') for update;
update user set  money = money + 1000 where title = 'A';
update user set money = money - 1000 where title = 'B';
select * from user where title in ('A','B');
commit;

MySQL和Redis事务的区别和用法

问题出现了,这里报出了错误,但是可以看到 前面的 SQL 已经是已执行的了,结果已经发生了变化,从这里看,似乎和 Redis 的处理差不多,除了错误之后语句继续执行。但是 值的注意的是, 在我们实际开发中,这种情况程序会直接抛出异常,以供我们在 catch 块中执行 rollback ,以回滚操作确保数据完整,即使是单独使用 MySQL 命令行 我们也可以用存储过程来对异常进行回滚。

语法错误

刚刚看到 Redis 当遇到 语法错误 时会自动丢弃事务,阻止提交,那 MySQL 呢?

MySQL和Redis事务的区别和用法

答案:不会,MySQL 在顺序执行时,如果未对异常进行处理,总会将成功执行的的提交,而不会触发自动终止,但是我们可以在程序执行时进行放弃提交。

Redis 为什么没有回滚?

Redis 的官方文档给出了这样的解释

// 只有在使用错误的语法调用时才会失败Redis命令(并且在命令排队期间无法检测到问题),或者对于持有错误数据类型的键,Redis命令可能会失败:这意味着实际上失败的命令是编程错误的结果,以及在开发过程中很可能检测到的一种错误,而不是在生产中。

  • Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a programming errors, and a kind of error that is very likely to be detected during development, and not in production.

// Redis内部简化且速度更快,因为它不需要回滚的能力。

  • Redis is internally simplified and faster because it does not need the ability to roll back.
  • 以上关于MySQL和Redis事务的区别和用法详细内容,对大家有帮助吗?如果想要了解更多相关,可以继续关注我们的数据库板块。 

您可能感兴趣的文档:

--结束END--

本文标题: MySQL和Redis事务的区别和用法

本文链接: https://www.lsjlt.com/news/35243.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis和mysql的区别对比
    redis和mysql的区别:类型:redis是内存中键值存储,mysql是关系数据库管理系统。数据模型:redis支持多种数据类型,mysql支持关系数据模型。存储:redis数据存储...
    99+
    2024-04-19
    mysql redis 键值对
  • MySQL和Redis的区别是什么
    这篇文章主要介绍“MySQL和Redis的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL和Redis的区别是什么”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • redis和mysql有什么区别
    redis 和 mysql 的主要区别在于:redis 是键值存储数据库,而 mysql 是关系型数据库。redis 读写速度快,并发性强,可扩展性好,而 mysql 读写速度稍慢,并发...
    99+
    2024-04-19
    mysql redis
  • mysql和redis有哪些区别
    这篇文章将为大家详细讲解有关mysql和redis有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql与redis的区别有:在类型上mysql是关系型数据库...
    99+
    2024-04-02
  • redis和mongodb的区别
    redis和mongodb的区别:1、在TPS方面redis性能要比mongodb大;2、redis操作更加便利,拥有较少的网络IO次数;3、mongoDB适合大数据量的存储,而redis能够存储的数据比mongoDB要少点;4、redis...
    99+
    2024-04-02
  • redis 和memcached区别
                    简单地比较Redis与Memcached的区别,大多数都会得到以...
    99+
    2024-04-02
  • mysql和postgresql的语法区别
    下面是MySQL和PostgreSQL之间常见的语法区别的一些详细比较: 数据类型差异: MySQL中的TEXT数据类型最大存储容量为64KB,而PostgreSQL中的TEXT数据类型没有此限制。M...
    99+
    2023-10-03
    mysql postgresql 数据库
  • Oracle 和MySQL的语法区别
     数据类型:Oracle和MySQL支持不同的数据类型。例如,Oracle支持RAW和LONG RAW类型,而MySQL不支持这些类型。MySQL支持SET和ENUM类型,而Oracle不支持这些类型。此外,Oracle支持DATE和TIM...
    99+
    2023-09-04
    oracle mysql 数据库
  • redis数据库和mysql数据库的区别
    差异化对比:redis 是基于内存的键值存储,数据访问速度极快,通常用于缓存等场景;mysql 是关系型数据库,数据存储在硬盘上,适用于需要持久化存储和强大查询功能的场景。 Redis...
    99+
    2024-04-19
    mysql redis 数据访问 并发访问
  • 【DataBase】Mysql和Oracle的语法区别?
    Mysql和Oracle是两种不同的关系型数据库。     MySQL通常在中小型应用程序、Web应用程序和小型企业中广泛使用,因为它易于学习和部署,而且成本较低。     Oracle数据库通常用于大型企业和复杂的企业级应用程序,因为它提...
    99+
    2023-10-27
    mysql oracle 数据库
  • chown和chmod的区别和用法
    一、chown和chmod的区别 1、chown 修改文件和文件夹的用户和用户组属性 要修改文件hh.c的所有者.修改为sakia的这个用户所有 chown sakia hh.c 这样就把hh.c的用户访问权限应用到sakia作为所有者 。...
    99+
    2023-10-29
    区别 chown chmod
  • MySQL 和 MongoDB 的区别
    MySQL 是一个关系数据库。 MongoDB 是 NoSQL 数据库。以下是 MySQL 和 MongoDB 之间的重要区别。高级。号键MySQLMongoDB1拥有/开发者MySQL 归 Oracle 所有。MongoDB 由 Mong...
    99+
    2023-10-22
  • mysql和pgsql的区别
    MySQL(全称为MySQL Database Management System)和PgSQL(全称为PostgreSQL)是两种常见的关系型数据库管理系统(RDBMS)。它们在以下几个方面存在一些...
    99+
    2023-09-16
    mysql 数据库 服务器
  • MySQL 和 PostgreSQL 的区别
    在这篇文章中,我们将了解 MySQL 和 PostgreSQL 之间的区别。MySQL它是一个关系数据库管理系统.它是Oracle公司开发的产品。它支持Windows、Mac OS X、Linux、 BSD、UNIX、z/OS、Symbia...
    99+
    2023-10-22
  • mongodb和mysql的区别
    mongodb和mysql的区别:1、数据模型,MongoDB是面向文档的数据库,MySQL是关系型数据库;2、查询语言,MongoDB使用MongoDB查询语言,MySQL是类似于JSON查询的语言;3、扩展性和性能,MongoDB使用可...
    99+
    2023-07-18
  • ClickHouse和MySQL的区别
    ClickHouse和MySQL是两种不同的数据库管理系统,它们具有一些区别和特点。 数据存储结构:ClickHouse是一种列式存储数据库,它以列为单位进行数据存储和处理。这种存储方式在处理大量数据时非常高效,特别适用于分析查询。而My...
    99+
    2023-08-16
    mysql 数据库 clickhouse
  • oracle 和 mysql的区别
    一、宏观上的区别: 1、mysql与oracle都是关系型数据库,应用于各种平台。mysql最开始是一个瑞典公司开发的,但后来被sun公司收购,后来sun又被oracle收购,所以现在可以说mysql属于甲骨文公司了,mysql开源免费的...
    99+
    2023-09-22
    mysql oracle 数据库 Powered by 金山文档
  • Mysql和Oracle的语法上的区别
    Mysql和Oracle的语法上一些常见的区别 分页查询:MySQL 使用 LIMIT 关键字实现分页查询,而 Oracle 使用 ROWNUM 关键字实现分页查询。 字符串连接:MySQL 使用 C...
    99+
    2023-09-15
    oracle mysql 数据库
  • kafka和redis的区别是什么
    Kafka和Redis是两种不同的数据存储系统,主要用途和设计理念也有所不同。 Kafka是一种分布式流数据平台,用于处理实时数据...
    99+
    2024-04-02
  • mongodb和redis的区别有哪些
    数据存储方式: MongoDB是一种基于文档的数据库,数据以文档的形式存储,每个文档是一个由键值对组成的数据结构。文档可以是嵌...
    99+
    2024-04-26
    redis mongodb
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作