java和Mysql数据一致性_Java中高并发下怎么保证数据一致性?

数据的一致性主要有这个几个方面数据库一致性:以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。假如我们设置为RC(即读取已提交),那么当两个事务并行执行时,可能出现就是其中一个事务还没执行完,但是另一个事务已经执行完,那么就会引发不可重复读的问题;而当我们设置为READUNCOMMITTED(即读取未提交),那么问题更大了,其中一个...
摘要由CSDN通过智能技术生成

数据的一致性主要有这个几个方面

数据库一致性:

以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。

假如我们设置为RC(即读取已提交),那么当两个事务并行执行时,可能出现就是其中一个事务还没执行完,但是另一个事务已经执行完,那么就会引发不可重复读的问题;

而当我们设置为READUNCOMMITTED(即读取未提交),那么问题更大了,其中一个事务还没执行完,读取到另一个事务中间更改的数据,假设另一个事务出现回滚,那么就出现脏读了;

但是呢?并非说RR就完全没问题,RR可能出现幻读。

你可以做如下操作:

1)打开两个客户端,均设置为RR;

2)在一个事务中,查询某个操作查到某份数据;比如是某个字段version=1存在数据;

3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;

4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;

这就是幻读了。

那么什么才是安全呢?

假设一个场景,当用户在支付这个模块,这需要很强的一致性。此时假设我们存在两个表,一个是订单表,一个是用户账号余额表;假设用户连点了两次支付(不要跟我说支付得输密码什么的,

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值