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

如何说服别人做网站59软文网

如何说服别人做网站,59软文网,网站创建app,模板网站和定制网站的区别前言:在 Java 开发中,事务管理是非常重要的一环。Spring 框架提供了Transactional注解来简化事务管理的操作,本文将深入介绍Transactional注解的用法,并结合代码示例进行详细讨论。 1.Transactional 注解简介 Transactional注解是…

        前言:在 Java 开发中,事务管理是非常重要的一环。Spring 框架提供了@Transactional注解来简化事务管理的操作,本文将深入介绍@Transactional注解的用法,并结合代码示例进行详细讨论。

1.@Transactional 注解简介

    @Transactional注解是 Spring 框架中用于管理事务的关键注解之一。通过在方法或类上添加该注解,Spring 会自动为被注解的方法创建一个事务,并在方法执行完毕后根据执行情况提交或回滚事务。这样可以确保数据库操作的原子性,保证数据的完整性。

@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public void updateUser(User user) {userRepository.save(user);}
}

在上面的示例中,@Transactional注解被添加到UserService类上,表示其中的方法将在事务管理下执行。

2.@Transactional 失效的情况

        尽管@Transactional注解可以很好地管理事务,但在某些情况下它可能会失效,导致事务无法正常工作。以下是一些可能导致@Transactional注解失效的情况:

2.1 自调用问题 

        如果在同一个类中,一个带有@Transactional注解的方法直接调用另一个带有@Transactional注解的方法,事务可能不会起作用,因为 Spring 默认使用代理机制来管理事务,自调用会绕过代理对象,导致事务失效。

@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public void updateUser(User user) {saveUser(user); // 这里的调用会绕过代理对象,事务失效}@Transactionalpublic void saveUser(User user) {userRepository.save(user);}
}

2.2 异常捕获问题

        当方法内部捕获了异常并不再抛出时,事务可能会失效。Spring 默认只会对未捕获的异常进行事务回滚,如果异常被捕获并在方法内部处理,事务可能无法正常回滚。

@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public void updateUser(User user) {try {userRepository.save(user);} catch (Exception e) {// 异常被捕获,事务可能无法回滚}}
}

2.3 抛出非运行时异常

        异常虽然抛出了,但是抛出的是非RuntimeException类型的异常,依旧不会生效。

@Transactional
public void deleteUser() throws MyException{userMapper.deleteUserA();try {int i = 1 / 0;userMapper.deleteUserB();} catch (Exception e) {throw new MyException();}
}

        如果指定了回滚异常类型为Exception,那么就可以回滚非RuntimeException类型异常了。

@Transactional(rollbackFor = Exception.class)

2.4 新开启一个线程

        如下的方式deleteUserA()也不会回滚,因为spring实现事务的原理是通过ThreadLocal把数据库连接绑定到当前线程中,新开启一个线程获取到的连接就不是同一个了:

@Transactional
public void deleteUser() throws MyException{userMapper.deleteUserA();try {//休眠1秒,保证deleteUserA先执行Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {int i = 1/0;userMapper.deleteUserB();}).start();    
}

2.5 非public方法

        如果@Transactional注解标记的方法是非public的,那么事务将失效。这是因为Spring默认使用基于代理的AOP来实现事务,而基于代理的AOP只能拦截public方法。

@Transactional
private void doSomething() {// 执行业务逻辑
}

2.6 未被Spring容器管理

        如果@Transactional注解标记的方法所在的类没有被Spring容器管理,那么事务将失效。这是因为Spring只会对由Spring容器管理的Bean进行事务管理。


public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void updateUser(User user) {userRepository.save(user);}
}

2.7 数据库本身不支持

        数据库本身不支持事务管理。mysql数据库,必须设置数据库引擎为InnoDB。

2.8 事务传播属性设置错误

        注意传播属性的设置,比如设置了:PROPAGATION_NOT_SUPPORIED(以非事务的方式执行,如果当前有事务则把当前事务挂起)。

3. 解决方案

        针对上述问题,我们可以采取一些解决方案来确保@Transactional注解的有效性。比如避免在同一个类中使用自调用的方式,或者在捕获异常后手动抛出以触发事务回滚。

4. 总结

        通过@Transactional注解,我们可以轻松管理事务,确保数据库操作的一致性。然而,在编写代码时需要注意可能导致注解失效的情况,避免出现意外的事务行为。持续学习和实践是掌握事务管理的关键,希望本文对您有所帮助。

http://www.rdtb.cn/news/12910.html

相关文章:

  • 俄文企业网站制作广州网站建设工作室
  • 12306网站是是阿里巴巴做的吗磁力岛
  • 太原这边有做网站的吗网站搜索引擎优化
  • 智慧团建如何在手机上登录武汉百度搜索优化
  • 聊城app制作网站做电商如何起步
  • 合肥专业手机网站制作价格网站优化推广费用
  • 做网站后面维护要收钱吗搜索引擎营销的五大特点
  • 有没有可以做各种字体的网站青岛网站建设策划
  • 企业网站新模式b站推出的短视频app哪个好
  • 泰州网站建设报价产品推广的目的和意义
  • 如何修改wordpress头部信息关键词排名优化技巧
  • 在线制作手机网站如何获取热搜关键词
  • 化妆品 网站建设案例搜索引擎营销的四种方式
  • 阜阳做网站哪家好外贸网站谷歌seo
  • 怎么看网站做没做备案东莞网络排名优化
  • 企业网站服务器多少钱镇江网站定制
  • 做区位图的网站平台推广广告宣传词
  • 北京网站建设多少钱线上营销平台
  • 代做动画毕业设计的网站全国新冠疫情最新消息
  • 外贸seo网站高端营销型网站
  • wordpress 类似博客福州seo网络推广
  • 网站服务器需要多少钱关键词收录查询工具
  • 8小8x人成免费观看长沙优化科技
  • 网站从哪些方面来做win10必做的优化
  • 国内禁用的国外网站今日疫情最新消息全国31个省
  • 国务院网站官网信息化建设规划各城市首轮感染高峰期预测
  • 做视频网站利润如何处理营销方式方案案例
  • 免费建网站抚顺网站seo优化方案
  • 外贸网站设计注意事项黄冈网站推广软件视频下载
  • 做设计任务的网站推广产品最好的方式