广告
返回顶部
首页 > 资讯 > 数据库 >怎么解决数据库事务居然没生效问题
  • 171
分享到

怎么解决数据库事务居然没生效问题

2024-04-02 19:04:59 171人浏览 安东尼
摘要

本篇内容介绍了“怎么解决数据库事务居然没生效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring

本篇内容介绍了“怎么解决数据库事务居然没生效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

spring声明式事务提供给 Javaer 们方便的事务配置方式,再搭配Spring  Boot自动配置,基本只需在方法上添加@Transactional注解,即可瞬间开启方法的事务性配置。

  • 但仅为方法添加@Transactional注解

怎么解决数据库事务居然没生效问题

你就以为这就够了吗?

事务未被正确处理,一般不会导致停止服务,更不易在测试阶段复现。但随系统业务越来越复杂,就会带来大量数据不一致问题,随后就是大量线上问题而后人工排查检修数据。

1 你的Spring事务怎么才算生效?

使用@Transactional开启声明式事务时, 灵魂发问:事务生效了吗?

案例

用户表实体类

怎么解决数据库事务居然没生效问题 

DAO 层

根据username查询所有数据

@Repository public interface UserRepository extends JpaRepository<UserEntity, Long> {     List<UserEntity> findByName(String name); }

Service层

UserService类

负责业务逻辑处理,包括如下方法:

createUserWrong1调用private方法:

怎么解决数据库事务居然没生效问题

createUserPrivate,被@Transactional注解。当传入的用户名包含test则抛异常,让用户的创建操作失败,期望事务回滚:

怎么解决数据库事务居然没生效问题

getUserCount

怎么解决数据库事务居然没生效问题 

Controller层

调用一下刚才定义的UserService中的入口方法createUserWrong1。

怎么解决数据库事务居然没生效问题

测试结果

即便用户名不合法,用户也能创建成功。刷新浏览器,多次发现非法用户注册。

2 @Transactional怎么确保生效?

除非特殊配置(比如使用AspectJ静态织入实现aop),否则只有定义在public方法上的@Transactional才能生效。

Spring默认通过动态代理实现AOP,对目标方法增强,private方法无法代理到,自然也无法动态增强事务处理逻辑。

那简单,把createUserPrivate方法改为public即可。

在UserService中再建一个入口方法createUserWrong2,来调用这个public方法再次尝试:

public int createUserWrong2(String name) {     try {         this.createUserPublic(new UserEntity(name));     } catch (Exception ex) {         log.error("create user failed because {}", ex.getMessage());     }     return userRepository.findByName(name).size(); }  //标记了@Transactional的public方法 @Transactional public void createUserPublic(UserEntity entity) {     userRepository.save(entity);     if (entity.getName().contains("test"))         throw new RuntimeException("invalid username!"); }

新的createUserWrong2方法事务同样不生效。

必须通过代理过的类从外部调用目标方法

要调用增强过的方法必然是调用代理后的对象。

尝试修改UserService,注入一个self,然后再通过self实例调用标记有@Transactional注解的createUserPublic方法。设置断点可以看到,self是由Spring通过CGLIB方式增强过的类。

CGLIB通过继承方式实现代理类,private方法在子类不可见,自然也就无法进行事务增强;

this指针代表对象自己,Spring不可能注入this,所以通过this访问方法必然不是代理。

把this改为self,在Controller中调用createUserRight方法可以验证事务生效了:非法的用户注册操作可以回滚。

虽然在UserService内部注入自己调用自己的createUserPublic可以正确实现事务,但这不符合习惯用法。更合理的实现方式是,让Controller直接调用之前定义的UserService的createUserPublic方法。

@GetMapping("right2") public int right2(@RequestParam("name") String name) {     try {         userService.createUserPublic(new UserEntity(name));     } catch (Exception ex) {         log.error("create user failed because {}", ex.getMessage());     }     return userService.getUserCount(name); }

this自调用/self调用/Controller调用UserService

怎么解决数据库事务居然没生效问题
  • this自调用

        无法走到Spring代理类

  • 后两种

        调用的Spring注入的UserService,通过代理调用才有机会对createUserPublic方法进行动态增强。

推荐在开发时打开相关Debug日志,以了解Spring事务实现的细节。

比如JPA数据库访问,可以这么开启Debug日志:

logging.level.org.springframework.ORM.jpa=DEBUG

开启日志后再比较下在UserService中this调用、Controller中通过注入的UserService  Bean调用createUserPublic的区别。

很明显,this调用因没走代理,事务没有在createUserPublic生效,只在Repository的save生效:

// 在UserService中通过this调用public的createUserPublic [23:04:30.748] [Http-NIO-45678-exec-5] [DEBUG] [o.s.orm.jpa.JpaTransactionManager:370 ] -  Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]:  PROPAGATION_REQUIRED,ISOLATION_DEFAULT  [DEBUG] [o.s.orm.jpa.JpaTransactionManager       :370 ] - Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT //在Controller中通过注入的UserService Bean调用createUserPublic [10:10:47.750] [http-nio-45678-exec-6] [DEBUG] [o.s.orm.jpa.JpaTransactionManager       :370 ] - Creating new transaction with name [org.geekbang.time.commonmistakes.transaction.demo1.UserService.createUserPublic]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

这种实现在Controller里处理异常显得繁琐,还不如直接把createUserWrong2加@Transactional注解,然后在Controller中直接调用该方法。

“怎么解决数据库事务居然没生效问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么解决数据库事务居然没生效问题

本文链接: https://www.lsjlt.com/news/61961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么解决数据库事务居然没生效问题
    本篇内容介绍了“怎么解决数据库事务居然没生效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring...
    99+
    2022-10-18
  • 怎么解决php exec函数没有生效问题
    这篇文章主要介绍“怎么解决php exec函数没有生效问题”,在日常操作中,相信很多人在怎么解决php exec函数没有生效问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决php exec函数没有生...
    99+
    2023-06-25
  • 怎么解决MySQL参数文件没有生效问题
    本篇内容介绍了“怎么解决MySQL参数文件没有生效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • 怎么解决php配置没有生效问题
    本篇内容介绍了“怎么解决php配置没有生效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php配置没有生效的解决办法:1、通过“pkil...
    99+
    2023-06-25
  • 在SSM中配置了事务控制但没生效怎么解决
    这篇文章主要介绍“在SSM中配置了事务控制但没生效怎么解决”,在日常操作中,相信很多人在在SSM中配置了事务控制但没生效怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在SSM中配置了事务控制但没生效怎...
    99+
    2023-06-29
  • 怎么解决数据库ORA-00837问题
    本篇内容介绍了“怎么解决数据库ORA-00837问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 解决...
    99+
    2022-10-19
  • 怎么解决数据库变慢问题
    这篇文章主要介绍“怎么解决数据库变慢问题”,在日常操作中,相信很多人在怎么解决数据库变慢问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决数据库变慢问题”的疑惑有所帮...
    99+
    2022-10-18
  • 怎么解决数据库ERROR 2003问题
    这篇文章主要介绍“怎么解决数据库ERROR 2003问题”,在日常操作中,相信很多人在怎么解决数据库ERROR 2003问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2022-10-19
  • 如何解决PHP开发中的数据库事务问题
    在PHP开发中,数据库事务是一个常见而重要的主题。事务可以确保一组数据库操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和完整性。本文将介绍如何使用PHP进行数据库事务处理,并提供了具体的代码示例。一、什么是数据库事务数据库事务...
    99+
    2023-10-21
    数据库(Database) PHP开发(PHP development) 事务(Transaction)
  • 怎么解决关于数据库insert问题
    本篇内容主要讲解“怎么解决关于数据库insert问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决关于数据库insert问题”吧!早上对几个10几G,上...
    99+
    2022-10-18
  • 怎么解决数据库LATCH:ROW CACHE OBJECTS问题
    这篇文章主要讲解了“怎么解决数据库LATCH:ROW CACHE OBJECTS问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决数据库LATCH:...
    99+
    2022-10-19
  • 怎么解决数据库ORA-12519 TNS问题
    这篇文章主要讲解了“怎么解决数据库ORA-12519 TNS问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决数据库ORA-12519 TNS问题”...
    99+
    2022-10-19
  • Oracle数据库rm -rf问题怎么解决
    本篇内容主要讲解“Oracle数据库rm -rf问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle数据库rm -rf问题怎么解决”吧!事故背景安排一个妹子在一台生产服务器上安...
    99+
    2023-06-02
  • LINQ映射数据库问题怎么解决
    这篇文章主要讲解了“LINQ映射数据库问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ映射数据库问题怎么解决”吧!LINQ映射数据库Linq映射数据库文件中常有 priva...
    99+
    2023-06-17
  • 怎么解决引用slf4j中Logger.info没有数据的问题
    这篇文章主要介绍“怎么解决引用slf4j中Logger.info没有数据的问题”,在日常操作中,相信很多人在怎么解决引用slf4j中Logger.info没有数据的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-22
  • 数据库上下文不存在或无效问题怎么解决
    数据库上下文不存在或无效问题可以通过以下几个步骤来解决: 检查数据库连接是否正确:确认数据库的连接字符串是否正确,包括数据库的地...
    99+
    2023-10-26
    数据库
  • Spring事务管理下synchronized锁失效问题怎么解决
    这篇文章主要介绍“Spring事务管理下synchronized锁失效问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring事务管理下synchronized锁失效问题怎么解决”文章...
    99+
    2023-06-29
  • Django框架ORM操作数据库不生效问题示例解决方法
    目录问题描述定位过程 首先,我们怀疑是SQL语句拼装错误(比如ID不对),导致了删除不生效解决方案总结本文详细描述使用Django 的ORM框架操作PostgreSQL数据库删除不生...
    99+
    2023-01-07
    django orm操作数据库不生效 django orm框架操作
  • 怎么解决Mybatis-Plus自动生成的数据库id过长问题
    这篇文章主要讲解了“怎么解决Mybatis-Plus自动生成的数据库id过长问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Mybatis-Plus自动生成的数据库id过长问题”吧...
    99+
    2023-06-21
  • mysql查找所有数据库中没有主键的表问题怎么解决
    今天小编给大家分享一下mysql查找所有数据库中没有主键的表问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。查找所...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作