Spring注解和同步锁不能同步问题解决
2019-12-23 12:08
3331 查看
这篇文章主要介绍了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() { ... ... } }
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- 解决spring自动注解不能自动动态转换接口类成实现类的问题;一般在配置databaseSource的XML中如下配置
- Spring @transactional注解和synchronized同步锁同时使用不能同步的问题
- 被事务代理的spring service 不能使用注解方式发布dubbo服务的问题解决
- 有spring管理的项目打成jar包无法扫描到注解的问题解决
- 在Ubuntu中用repo下载和同步不同的工程,提示不能下载的问题解决方法
- spring注解实现业务层事务管理,当业务层自调用时,事务失效问题解决
- nfs client不能同步nfs server的问题(已解决)
- 解决Spring中AOP不能切入Struts的DispatchAction方法的问题
- 解决spring-mvc @responseBody注解返回json 乱码问题
- spring+ mybatis 事务不能回滚问题解决
- spring@Transactional注解解决事务处理问题
- 解决windows server 有的机器是时间不能同步问题
- win2003上不能与iphone同步问题解决
- Spring注解编程时用junit测试时,显示jdK版本过低问题,更改版本后仍然不行的解决方法
- spring-mvc解决EL表达式不能使用问题
- 解决Firefox不能同步问题
- Spring 和 java 反射及自定义注解的问题解决!!
- 基于注解的spring缓存,轻松无侵入解决cache问题
- owncloud windows客户端不能同步的问题解决
- JPA与Spring2.5整合时发生不能创建entityManagerFactory的问题解决方法