数据的一致性主要有这个几个方面
数据库一致性:
以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。
假如我们设置为RC(即读取已提交),那么当两个事务并行执行时,可能出现就是其中一个事务还没执行完,但是另一个事务已经执行完,那么就会引发不可重复读的问题;
而当我们设置为READUNCOMMITTED(即读取未提交),那么问题更大了,其中一个事务还没执行完,读取到另一个事务中间更改的数据,假设另一个事务出现回滚,那么就出现脏读了;
但是呢?并非说RR就完全没问题,RR可能出现幻读。
你可以做如下操作:
1)打开两个客户端,均设置为RR;
2)在一个事务中,查询某个操作查到某份数据;比如是某个字段version=1存在数据;
3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;
4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;
这就是幻读了。
那么什么才是安全呢?
假设一个场景,当用户在支付这个模块,这需要很强的一致性。此时假设我们存在两个表,一个是订单表,一个是用户账号余额表;假设用户连点了两次支付(不要跟我说支付得输密码什么的,