redis的事务
什么是事务?
把一组数据库操作放在一起执行,保证原子性,要么同时成功,要么同时失败。
redis的事务
允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部分原子性
redis的事物只能保证部分原子性:
1)如果一组命令中,在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。
2)如果一组命令中,在在压入事务队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能保证事务的原子性
redis事务和mysql事务的区别?
redis事务过程:
redis提供的事务是将几个命令打包,然后一次性、按照先进先出的顺序有序地执行。在执行过程中不会被打断*(在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中),当事务队列中的所有命令都被执行(无论成功还是失败)*完毕之后,事务才会结束。
MULTI //开始事务
SET ... //命令1入队
GET ... //命令1入队
SADD ... //命令1入队
......
EXEC //执行事务(一次执行1.2.3...)
如上所示,redis的事务是以MULTI命令开始,之后是用户输入的多个命令,最后以EXEC命令结束。由于这种简单的事务在EXEC命令被调用之前不会执行任何实际操作,所以用户将没有办法根据根据读到的数据来做决定
传统关系型数据库(MySQL):
首先开启事务,接着进行一系列的读写操作,最后用户可以选择发送commit来提价事务,或者发送rollback放弃之前的修改。
Connection conn = ... //获取数据库连接
conn.setAutoCommit(false); //开启事务
try{
//......执行增删改查sql
//......执行增删改查sql
conn.commit(); //提交事务
}catch (Exception e) {
conn.rollback();//事务回滚
}finally{
conn.close();//关闭链接
}
总结:
mysql在事务开始后对数据库的操作是执行的,而redis在事务开始命令后的操作是记录在队列里,没有执行,在事务结束后才按顺序执行。
redis事务操作的命令
1、multi 用来标记一个事务的开始。
2、exec 用来执行事务队列中的所有命令
3、discard 清除所有已经压入队列中的命令,并且结束整个事务
4、watch 监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行,否则,正常执行
例:
set balance 100
set balance2 1000
set version 1
watch version
multi
decrby balance 50
incrby balance 50
exec
5、unwatch 放弃监控所有的键
watch version
unwatch
redis事务的小结
1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。
2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。