当前位置: 首页 > news >正文

成都网站建设公司好做吗大型网站服务器多少钱

成都网站建设公司好做吗,大型网站服务器多少钱,邯郸网络运营中心地址在哪里,网站设计的关键Transactional的底层是如何实现的 底层是通过动态代理实现的。Spring Boot 在运行时会生成一个代理对象#xff0c;该代理对象被注解的方法调用#xff0c;并在方法调用前后进行事务管理#xff0c;事务管理包括开启事务#xff0c;提交事务或回滚事务等操作。 1开启事务 …Transactional的底层是如何实现的 底层是通过动态代理实现的。Spring Boot 在运行时会生成一个代理对象该代理对象被注解的方法调用并在方法调用前后进行事务管理事务管理包括开启事务提交事务或回滚事务等操作。 1开启事务 2执行业务逻辑 3提交/回滚事务 Transational中常见的参数有哪些 value-指定bean的名称 指定事务管理器的 bean 名称。当应用中存在多个事务管理器时可以通过该参数指定要使用的事务管理器 Transactional(value myTransactionManager) public void someMethod() {// 业务逻辑 } propagation-指定Spring事务的传播行为 指定事务的传播行为即当一个事务方法被另一个事务方法调用时事务如何进行传播。Spring 定义了 7 种传播行为常用的有以下几种 Propagation.REQUIRED默认值如果当前存在事务则加入该事务如果当前没有事务则创建一个新的事务。Propagation.REQUIRES_NEW无论当前是否存在事务都会创建一个新的事务并且挂起当前事务如果存在。Propagation.NOT_SUPPORTED以非事务方式执行操作如果当前存在事务则挂起当前事务。Propagation.SUPPORTS如果当前存在事务则加入该事务如果当前没有事务则以非事务方式执行。Propagation.MANDATORY表示该方法必须在一个事务中运行如果当前没有事务则抛出异常。Propagation.NEVER表示该方法不能在一个事务中运行如果当前存在事务则抛出异常。Propagation.NESTED如果当前存在事务则在嵌套事务内执行如果当前没有事务则创建一个新的事务 Transactional(propagation Propagation.REQUIRES_NEW) public void someMethod() {// 业务逻辑 } timeout-事务的超时时间 Transactional(timeout 5) public void someMethod() {// 业务逻辑 } readOnly-事务只读不可进行写操作 Transactional(readOnly true) public void someMethod() {// 只读业务逻辑 } rollbackFor-遇到哪些异常回滚 指定哪些异常类型会导致事务回滚。可以指定多个异常类型用逗号分隔 Transactional(rollbackFor {SQLException.class, MyCustomException.class}) public void someMethod() throws SQLException, MyCustomException {// 业务逻辑 } 什么情况会导致Transactional失效  1.添加到非public方法上 2.使用try catch处理异常 3.调用类内部的Transactional注解嵌套使用 4.事务的传播机制使用不当 5.数据库不支持事务 为什么Transational注解内部调用会导致事务失效呢  Spring 的 Transactional 注解是基于 AOP面向切面编程实现的。AOP 通过代理模式为目标对象创建代理对象在代理对象中织入事务管理的逻辑例如在方法调用前后开启、提交或回滚事务。 当外部调用带有 Transactional 注解的方法时实际上是调用的代理对象的方法代理对象会处理事务相关的操作 当在同一个类的一个方法中调用另一个带有 Transactional 注解的方法时这种调用属于内部调用 在内部调用时并没有经过代理对象而是直接调用了目标对象的方法绕过了 AOP 代理的事务增强逻辑从而导致事务失效 为什么参数rollbackFor要用Exception.class 如果不配置Exception.class的话事务只会遇到RunTimeException的时候回滚 如果配置了的话那么事务遇到非运行时异常时也回滚 也就是我们的Exception包含了所有异常这个的意思是我们遇到异常就回滚而不是遇到特定的运行时异常RunTimeException的时候回滚 如果想要嵌套事务调用Transational修饰的方法生效该怎么办 方法一注入自身 Bean 在类中通过依赖注入自身的 Bean然后使用注入的 Bean 进行内部方法调用这样就可以通过代理对象调用方法使事务注解生效 因为我们Bean注入了所以这个对象可以通过代理对象调用方法 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;Service public class UserService {// 注入自身的 BeanAutowiredprivate UserService self;public void outerMethod() {// 通过注入的 Bean 调用带有 Transactional 注解的方法self.innerMethod();}Transactionalpublic void innerMethod() {// 业务逻辑System.out.println(执行内部方法的业务逻辑事务生效);} } 方法二使用 AopContext.currentProxy() 获取代理对象 在配置类中开启 exposeProxy true之后在代码里使用 AopContext.currentProxy() 获取当前代理对象再通过代理对象调用方法 import org.aspectj.lang.annotation.Aspect; import org.springframework.aop.framework.AopContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;// 配置类开启 exposeProxy Configuration EnableAspectJAutoProxy(exposeProxy true) class AopConfig {// 可以添加其他配置 }Service public class UserService {public void outerMethod() {// 获取代理对象并调用带有 Transactional 注解的方法((UserService) AopContext.currentProxy()).innerMethod();}Transactionalpublic void innerMethod() {// 业务逻辑System.out.println(执行内部方法的业务逻辑事务生效);} } 方法三getBean方法获取自身Bean实例 这种方法是和注入Bean是一样的 借助 ApplicationContext 获取 Bean 实例。首先要将 ApplicationContext 注入到服务类中然后使用 getBean 方法获取自身 Bean 实例再通过该实例调用带有 Transactional 注解的方法 import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;Service public class UserService implements ApplicationContextAware {private ApplicationContext applicationContext;Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;}public void outerMethod() {// 通过 getBean 方法获取自身 Bean 实例UserService self applicationContext.getBean(UserService.class);// 调用带有 Transactional 注解的方法self.innerMethod();}Transactionalpublic void innerMethod() {// 业务逻辑System.out.println(执行内部方法的业务逻辑事务生效);} }
http://www.hkea.cn/news/14405987/

相关文章:

  • 安卓app整站织梦网站源码网站开发如何设置背景图片
  • html5视频网站模板知名品牌营销策划案例
  • 余姚响应式网站建设凡科建站怎么做微网站
  • 寻找网站建设公司网站的推广费用
  • 网站从新建设影响收录么爱网云主机
  • 什么企业需要网站建设wordpress 文章截断
  • 做公司的网站wordpress配置邮件服务器
  • 怎么做婚庆网站平台网站开发语言为wap
  • 百度网站下载安装房地产估价师
  • 怎样在赶集微网站做微招聘信息天津网站制作福州
  • 一级域名的网站制作安徽茶叶网站建设
  • 瀑布流的网站wordpress集成vue
  • seo整站优化报价查排名
  • 怎么建立企业网站免费的焦作专业做网站公司
  • ip加端口可以做网站吗牟平建设企业网站
  • 沈阳公司网站爱营销电信版下载app最新版
  • 如何将域名和网站绑定二手书网站建设的意义
  • 水果电商网站开发方案服务信誉好的外贸管理软件
  • wordpress清理网站缓存dede 汽车网站模板
  • 辽阳网站设计wordpress批量注册会员
  • 做网站首页布局设计注意事项wordpress shortlink
  • 大岭山镇网站建设wordpress注册qq邮箱配置
  • 营销型网站建设要多少钱管理培训班
  • 一般做网站需要多少钱建基建设集团网站
  • 米方科技网站建设网课编程
  • 专业建站公司哪家有名自己做装修效果图app软件
  • 应聘的做网站推广的wordpress主动推送所有网址插件
  • 学做网站推广要多久时间龙口网页定制
  • 廊坊网站建设策划全球速卖通官网入口
  • 网站开发流程 知乎wordpress软件商城