16-6 阶段练习
来源:16-6 阶段练习

SuccessorSocialism
2019-03-11
作业1:可以配置 @Transactional 的一些属性做做实验,验证 Spring 的事务处理机制!
这个可以根据前面的课程来做,而且前面的视频已经介绍够清楚了!
作业2:@Transactional 注解也被称作是声明式事务,它是基于 Spring AOP 实现的,你能解释 AOP 的实现原理吗 ?
AOP:面向切面编程,AOP就是在目标方法执行前可以自定义一些操作,在方法执行中机或者执行后也可以自定义操作,所以,一般都是基于代理模式来实现,spring支持两种代理模式,jdk原生的代理和cglib代理。
AOP可以给程序带良好的扩展性和封装性,可以实现业务代码与业务无关代码的隔离。比如:数据库的connection.close()默认是把连接关闭掉,但是数据库连接池的场景中,为了不改变用户的使用习惯,一般调用close的时候是把连接重新放回到池中,这是因为从数据库连接池中拿到的连接实际上是原生连接的一个代理类,所以内部把close给重写了。实际上代理模式的优点实际上也是aop的优点。
作业3:@Transactional 只能应用到 public 方法才有效,这是为什么呢 ?
@Nullable protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class targetClass) { //这里判断是否是public方法 if(this.allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { return null; } //......
作业4:@Transactional 注解通常会加在 Service 上,那么 Controller 可以加吗 ? 为什么呢 ?
不可以放在Controller吧。因为Spring容器先扫描了controller层,然后再配置的事务,这个时候事务对controller的注解不起作用!!!
作业5:Spring 的事务处理可以正确的操作一个服务实例对数据记录的提交与回滚,一致性问题可以由 Spring 去保证。但是,如果多个服务实例同时修改同一条数据记录,怎么保证数据的一致性呢 ?你能提出哪些解决办法呢 ?
加锁?黑人问号脸?或者指定事务模式???
不是很懂
2回答
-
同学你好:
非常感谢你的回答!关于作业1、2、3你给出的答案已经非常好了,我不多做解释。对于作业4和作业5,我给出对应的解释。
作业4:@Transactional 注解通常会加在 Service 上,那么 Controller 可以加吗 ? 为什么呢 ?
@Transactional 注解是不能加在 Controller 上的,这会导致你的接口 404(当你的 Controller 直接是实现类时)。具体的原因可以参考这篇文章:http://www.importnew.com/28465.html。
作业5:Spring 的事务处理可以正确的操作一个服务实例对数据记录的提交与回滚,一致性问题可以由 Spring 去保证。但是,如果多个服务实例同时修改同一条数据记录,怎么保证数据的一致性呢 ?你能提出哪些解决办法呢 ?
其实这就涉及分布式事务了(多实例同时修改同一条数据记录),有两种办法解决这个问题:
1. 让数据库来保证:即数据库加锁,可以考虑悲观锁 select … for update;乐观锁,基于 CAS 的 version 等等;
2. 自己实现锁来保证:由于是多个实例(即多个 JVM),所以,必须要使用分布式锁来完成。此时可以考虑使用 Redis、ZK 等实现。
欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!
522020-09-08 -
黎明的烬
2021-03-14
试了一下 ,是可以放在controller上的啊;
00
相似问题