springboot之事务

1单机事务   

A-->B  用户表、账户表、订单表都在一个mysql中

A转账给B,那么正常情况下A账户减钱,B账户加钱,如果A减钱成功,B账户加钱失败,那么A账户也要减少钱失败

2分布式事务

分布式事务处理通过二次提交,需要保证数据的一致行

3事务的隔离机制

Serializable: 串行处理,消耗资源,最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用

例如:A转给B100万,发现转错了,A不能找B要回这100W,只能等着B获取100W后再去协商

Read uncommitted(读未提交):一个事务可以提取读取另外一个未提交的事务的数据

例如:A要转给B100万,发现转错了,B还没有获取到这100W,A可以要求将这笔钱转回去

Read committed (读提交):  一个事务要等另一个事务读取之后才能提交事务

例如:A要转给B100万,B看见A的卡里有100万,很高兴,但是C急用钱,将A的100万转走了,那么A无法转给B  100W

若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

Repeatable read(重复读):开始读取数据(事务开启)时,不再允许修改操作

例如:A要转给B100万,B看见A的卡里有100万,很高兴,C急用钱,想要将A的100万转走,但是不行,因为钱已经先要转给B了

重复读可以解决不可重复读问题,但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作

幻听:A转给B100万,B看见账户就是100W,这个时候,A又给B转了20万,那么B去查,发现账户是120W,这就是幻听,可以通过序列化解决

 

 

原文地址:https://www.cnblogs.com/zhushilai/p/13597584.html