添加评论中会用到事务管理。
解决的程度不同,层级不同。我们一般选择中间的级别。
选择时既能满足业务的需要,又能保证业务的安全性,在这样的前提下我们追求一个更高的性能。
第一类丢失更新
图中是没有事务隔离的情况
第二类丢失更新
脏读
不可重复读:结果不一致
幻读:行数不一致
事务隔离级别
中间两个解决了一部分的问题,幻读是可以被接受的。
数据库保障数据的机制,两种实现方式,一种是悲观锁,另一种是乐观锁。数据库中自带的就都是悲观锁。乐观锁默认没有,需要自己实现。
所谓的悲观锁就是看待问题非常的悲观,如果并发的话一定有问题,既然又问题就提前对问题加锁。加锁的话有两种锁,一种是共享锁S锁,另一种是排它锁X锁。
乐观锁需要我们去实现,总是乐观的看待问题,即是并发了也不会认为有问题,该什么操作什么操作,如果遇到了什么问题再去加锁。当我们更改数据的时候我们去看数据有没有变,如果变了,在处理的过程中有人改了,我们应该放弃这次 操作,否则我们就提交数据。我们通常通过实版本号,时间戳等检查变没变。
在开发过程中Spring对开发提供了支持。
Spring中有Transaction Management中有事务管理。
演示事务管理,模拟某一个业务,所以代码写在service。模拟需求为注册一个用户user,第二步自动的给用户发一个帖子,一个业务 中有两个增加的操作,业务中需要保证事务。
首先注入用户User和发的帖子注入到业务中,
编写实现操作的编写实现操作的方法。
首先编写方法内的事务逻辑。
通过注解的形式管理,使其成为一个整体。任何地方报错我们都需要回滚。
@Trasaction注解需要添加参数指定隔离级别isolation,事务的传播机制是通过Propagation实现的。
传播机制:在调用业务方法的时候会不会调用另外的一个组件的业务方法。即业务方法A可能会调用业务方法B。而这两个方法,A和B都可能去管理事务,是以A的事务为准还是以B的事务为准。事务传播机制就是解决这种交叉的问题。
编写测试代码:
编程时事务的实现:
注入Bean,通过TransactionTemplate实现管理事务。
通过调用TransacationTemplate实现隔离界级别和传播机制。
execute需要重写一个方法。重写方法返回的类型和泛型是一致的。