事务
事务可以理解为一组指令的合集。
MySQL
MySQL与硬盘进行数据交换,它对于事务的支持具有四大特性,也就是我们常说的ACID特性,即原子性、一致性、隔离性和持久性。
对于一个事务,如果其中的某条指令发生错误,则整个事务都不会成功,会回滚。
举耳熟能详的银行转账问题的例子来说,张三转给李四100块钱是一个事务,这个事务包含两个操作,一个是张三转出100元,一个是李四接收100元。对于MySQL来说,如果这两个操作任何一个出现问题,则整个事务都会回滚,也就是说张三和李四卡中的金额还是之前的金额。
Redis
Redis存在于内存中,它是一种NoSQL型数据库。它对于事务的支持并没有以上的特性,它具有一次性、顺序性、排他性的特性。
对于一个事务,如果其中的某条指令发生编译错误,则整个事务都不会执行。这个很好理解,编译没有通过,相当于你面对老外不会说英语一样,先回炉重造吧,把语法修正。如果其中的某条指令发生运行错误,则事务照常进行,只不过运行错误的语句不会产生结果。
multi
set k1 v1
incr k1
set k2 v2
exec
对于这个事务来说,第二行设置的是String的数据类型,String数据类型是无法incr
的,因此第三行会抛出异常,但是第四行语句会照常进行。在事务执行完毕,get k2
是可以取到v2
的。
讲到这里,大家可以明白Redis和MySQL对于事务的不同支持了吧。