作业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 去保证。但是,如果多个服务实例同时修改同一条数据记录,怎么保证数据的一致性呢 ?你能提出哪些解决办法呢 ?
加锁?黑人问号脸?或者指定事务模式???
不是很懂