gpt4 book ai didi

mysql - HandlerSocket 事务

转载 作者:IT王子 更新时间:2023-10-29 06:01:43 24 4
gpt4 key购买 nike

在Redis中可以这样完成事务:

redis.watch('powerlevel')
current = redis.get('powerlevel')
redis.multi()
redis.set('powerlevel', current + 1)
redis.exec()
  1. 是否可以使用 HandlerSocket 执行此操作?
  2. 使用交易提供 handlersotsket 的一般特性是什么?

最佳答案

将 Redis“事务”与通用事务引擎进行比较总是有点误导。 Redis WATCH/MULTI/EXEC block 是:

  • 不是原子的(出错时不回滚)
  • 一致的(反正 Redis 的一致性规则不多)
  • 完全隔离(所有内容都是序列化的)
  • 如果选择 AOF+fsync 策略可能是持久的

因此,Redis 并未完全提供通常用于定义事务的完整 ACID 属性。与大多数事务引擎相反,Redis 提供了非常强大的隔离,并且不尝试提供任何回滚功能。

问题中提供的示例并不是真正具有代表性的 IMO,因为可以通过使用以下方法以更简单的方式实现相同的行为:

redis.incr( "powerlevel")

因为 Redis 单个 操作始终是原子的和孤立的。

WATCH/MULTI/EXEC block 通常在必须强制执行各种键之间的一致性或实现乐观锁定模式时使用。换句话说,如果您的目的只是增加独立的计数器,则无需使用 WATCH/MULTI/EXEC block 。

HandlerSocket 是一个完全不同的野兽。它建立在 MySQL 的通用处理程序之上,根据底层存储引擎的不同,事务行为会有所不同。例如,当它与 MyISAM 一起使用时,它将不使用 ACID 事务,但一致性将通过表级别的 R/W 锁来确保。对于 InnoDB,ACID 事务将与默认隔离级别一起使用(可以在 InnoDB 配置 AFAIK 中设置)。 InnoDB 实现了 MVCC(多版本并发控制),因此锁定比 MyISAM 复杂得多。

HandlerSocket 与两个工作线程池一起工作(一个用于只读连接,一个用于面向写入的连接)。人们应该使用多个读取工作线程,但只使用一个写入线程(可能是为了减少锁定争用)。所以在基本配置中,写操作是序列化的,而不是读操作。 AFAIK,与 Redis 具有相同隔离语义的唯一可能性是只使用面向写入的套接字来执行读取和写入操作,并且只保留一个写入线程(所有操作的完全序列化)。不过,它会影响可扩展性。

从 HandlerSocket 协议(protocol)中,无法访问事务功能。在每个事件循环迭代中,它收集所有操作(来自所有套接字),并为所有这些操作执行唯一事务(仅与 InnoDB 相关)。据我所知,用户无法更改此交易的范围。

结论是通常不可能使用 HandlerSocket 模拟 Redis WATCH/MULTI/EXEC block 的行为。

现在,回到示例,如果目的只是以一致的方式递增计数器,the HandlerSocket protocol 完全支持这一点。 .例如,+/-(递增/递减)操作可用,还有 U?操作(类似于 Redis GETSET 命令),或 +?/-? (递增/递减,返回之前的值)。

关于mysql - HandlerSocket 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com