Spring注解和同步锁不能同步问题解决

 更新时间:2019年12月23日 09:06:00   作者:1024。  
这篇文章主要介绍了Spring注解和同步锁不能同步问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Spring注解和同步锁不能同步问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

结论:如果在service层的方法上同时使用事务和同步锁无法保证数据同步。

@Service
public class ServiceImpl{
    
  private static Lock lock = new ReentrantLock(false);
    
  @Transactional(rollbackFor = Exception.class)
  public void update() {
    try {
      lock.lock();
      ... ...
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
}

上面这个例子无法保证数据的一致性,synchronized 同理。

原因:

  根据spring的AOP的特性,会在update方法之前开启事务,之后再加锁,当锁住的代码执行完成后,再提交事务。

  由于lock代码块执行是在事务之内执行的,在代码块执行完时,事务还未提交,因此其它线程进入synchronized代码块后,读取的数据库数据不是最新的(脏读)。

解决方案:

  1.在还没有开启事务之前就加同步锁,用加锁的方法调用加事务的方法

@Service
public class ServiceImpl{

  private static Lock lock = new ReentrantLock(false);

  public void update1() {
    try {
      lock.lock();
      update2();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }

  @Transactional(rollbackFor = Exception.class)
  public void uodate2() {
    ... ...
  }
}

2.把锁放到上一层

@Controller
public class TestController{
  @Autowired
  private IServiceImpl serviceImpl;
    
  private static Lock lock = new ReentrantLock(false);
    
  public String test() {
    try {
      lock.lock();
      serviceImpl.update();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
}

@Service
public class ServiceImpl{

  @Transactional(rollbackFor = Exception.class)
  public void update() {
    ... ...
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现简易版联网坦克对战小游戏(附源码)

    Java实现简易版联网坦克对战小游戏(附源码)

    这篇文章主要给大家介绍了关于Java实现简易版联网坦克对战小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • druid ParserException类错误问题及解决

    druid ParserException类错误问题及解决

    这篇文章主要介绍了druid ParserException类错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java8中的Lambda表达式理解与使用示例详解

    Java8中的Lambda表达式理解与使用示例详解

    Lambda表达式是Java8引入的一种简洁写法,用于实现函数式接口,可以简化匿名函数的代码,本文给大家介绍Java8中的Lambda表达式理解与使用示例,感兴趣的朋友一起看看吧
    2024-11-11
  • 关于IDEA无法预览Markdown文件的解决思路

    关于IDEA无法预览Markdown文件的解决思路

    在IntelliJ IDEA中,有时Markdown文件无法预览可能是因为文件关联设置不正确或配置信息错误,首先,检查IDE的File Types设置,确保.md和.markdown后缀已正确注册,其次,对照官方配置信息,调整Markdown设置
    2024-09-09
  • Mac系统搭建JDK及JMETER过程解析

    Mac系统搭建JDK及JMETER过程解析

    这篇文章主要介绍了Mac系统搭建JDK及JMETER过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java实现简单台球游戏

    Java实现简单台球游戏

    这篇文章主要为大家详细介绍了Java实现简单台球游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java Web实现添加定时任务的方法示例

    Java Web实现添加定时任务的方法示例

    这篇文章主要介绍了Java Web实现添加定时任务的方法,涉及java web定时任务控制类定义、调用及监听器定义、添加等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • SpringBoot框架实现支付和转账功能

    SpringBoot框架实现支付和转账功能

    在 Spring Boot 框架中实现支付和转账功能时,涉及到多个细节和注意点,这些功能通常需要高度的安全性、稳定性和可扩展性,本文介绍了实现支付和转账功能的一些关键点,需要的朋友可以参考下
    2024-08-08
  • Java连接Sql数据库经常用到的操作

    Java连接Sql数据库经常用到的操作

    这篇文章主要介绍了Java连接Sql数据库经常用到的操作的相关资料,需要的朋友可以参考下
    2016-02-02
  • Spring Security6 最新版配置及实现动态权限管理

    Spring Security6 最新版配置及实现动态权限管理

    Spring Security 在最近几个版本中配置的写法都有一些变化,很多常见的方法都废弃了,并且将在未来的 Spring Security7 中移除,因此又补充了一些新的内容,重新发一下,供各位使用 Spring Security 的小伙伴们参考,需要的朋友可以参考下
    2024-03-03

最新评论