什么事数据库事务?
一次在跟数据库的会话当中, 所有执行的sql要么一起成功,要么一起失败。
数据库事务4大特性
ACID:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
单次操作,执行一组命令,需要创建与其相关联的命令
如:MULTI,EXEC,DISCARD,WATCH开启处理Redis事务
假如我有3个命令需要一起执行
该命令 HSET user:001 id 11 uname li4 在 Redis 中执行了两个操作:
- 它尝试在键名为 user:001 的哈希表中设置字段 id 的值为 11。
- 它尝试设置字段 uname 的值为 li4。
理解这个命令的关键在于知道 Redis 的哈希表结构允许你将多个键值对存储在一个名为 key 的内部结构中。在这个例子中,user:001 是哈希表的名称,可以看作是一个用户对象,其中 id 和 uname 是该用户对象的两个属性。
然而,这个命令实际上是不正确的。在 Redis 的标准 HSET 用法中,你需要为每个字段和值对提供单独的参数,如下所示:
HSET user:001 id 11
HSET user:001 uname li4
或者,你可以一次性设置多个字段,如:
HSET user:001 id 11 uname li4
这样,哈希表 user:001 将包含两个字段:id 和 uname,它们的值分别是 11 和 li4。
如果你正是想以这种方式设置多个字段,那么应该确保命令语法正确。如果你使用的是 Redis 的最新版本,上面提供的一次性设置多个字段的命令将正常工作。如果你使用的是 Redis 的早期版本,你可能需要分两次执行 HSET 命令,每次设置一个字段。
redis事务和数据库事务区别
MULTI 开启事务 会回ok
案例演示
事务提交
事务放弃
此时k2 还是v2不是v22
如果在事务中发生错误
1.在还没执行exec之前,任何一个命令有语法错误,所有的命令都不会被执行
2.执行后发生异常,异常的执行失败,其他命令执行成功。
email自增操作肯定不对
其他命令正常执行,k1为新值
Watch监控
类似于JUC的CAS
balance是银行余额
开启监控,如果没有人来抢,正常执行,在事务中balance从100成功修改为110。
举例
此时balance是110,开启了监控,此时我想把balance设置为200,但是此时有人比我先行一步
其他客户端操作了balance
回到刚才客户端 可以set balance 200成功,但是提交事务的时候就会返回空。
事务执行失败,全部命令执行不成功
全部命令执行不成功。【因为服务器的版本更新了】