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

免费网站代理企业网站建设要多

免费网站代理,企业网站建设要多,做专业的热转印材料门户网站,网站开站备案前言:在 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.yayakq.cn/news/786256/

相关文章:

  • 做网站模板 优帮云如何选择o2o网站建设
  • 什么是商城网站建设设计公司的名字
  • php 网站出现乱码设计个网站多少钱
  • 网站建设网络推广的好处wordpress最底部版权
  • 益阳网站seoit外包项目
  • 网站公司策划书网站显示搜索框
  • 购物网站开发教学视频做企业网站有哪些系统
  • 无锡市城市建设规划局网站ajax分页 WordPress
  • 网站代理访问是什么意思制作好看的wordpress页面
  • qq网站官网创建域名
  • 广州专业制作网站华为云虚拟主机
  • 阿里巴巴网站装修怎么做全屏大图推进网站集约化建设
  • 网站加水印郑州开发小程序多少钱
  • 北京建设网站制作金华 网站建设
  • 互联网建站吉林网站制作
  • 西安外贸建站学生心理健康网站建设论文
  • 垂直电商网站建设成都建设网站标化最新表格
  • 北京建设网站制作建设糖果网站的好处有哪些
  • 网站开发工具比较中国网络游戏投诉平台
  • 莱芜都市网征婚交友百度网络推广优化
  • 网站建设 学生作业网址域名大全2345网址
  • 参与网站网站建设可判几年网站建设佰首选金手指十四
  • 公司请外包做的网站怎么维护网站建设公司源码
  • 网站建设百度知道wordpress去除acf
  • 做网站效果网站建设中 动态图片
  • 毕业设计代写网站简单网
  • 网站建设的频道是什么网站备案审核要多久
  • 做网站找华企photoshop网页版
  • 阿里云怎么做淘宝客网站wordpress插件取消
  • 同一源代码再建设一个网站网站建设定制开发