Spring @transactional注解和synchronized同步锁同时使用不能同步的问题
2018-01-20 00:00
1636 查看
摘要: 目前在做的系统中有一个获取流水号的功能,要求每次请求获取到的流水号唯一。为控制并发问题,想过在用Synchronized method(){}或者method(){ Synchronized(this){ } }来控制,两个同样的记录去做并发测试,同步方法或者代码块并没有起作用。Synchronized加在@Transactional事务注解的方法时,同步并不起作用,可以新建不带用事务注解的同步方法,然后再调用method。
如果在service层的方法上同时使用事务和同步锁无法保证数据同步
*上面这个例子无法保证数据的一致性
由于spring的AOP的特性,会在update方法之前开启事务,之后再加锁,当锁住的代码执行完成后,在提交事务。
因此synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,因此其它线程进入synchronized代码块后,读取的数据库数据不是最新的。
为了解决上面的并发同步问题,可以通过synchronized方法调用update()方法,在还没有开事务之前就加同步锁,那么就可以保证线程同步。
1、原实现同步方法
同步方法或者同步方法块都不能达到同步的作用。
2、修改后的方法
如果在service层的方法上同时使用事务和同步锁无法保证数据同步
@Service public class Service{ @Transactional(readOnly = false) public void synchronized update() { ............ } }
*上面这个例子无法保证数据的一致性
由于spring的AOP的特性,会在update方法之前开启事务,之后再加锁,当锁住的代码执行完成后,在提交事务。
因此synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,因此其它线程进入synchronized代码块后,读取的数据库数据不是最新的。
为了解决上面的并发同步问题,可以通过synchronized方法调用update()方法,在还没有开事务之前就加同步锁,那么就可以保证线程同步。
1、原实现同步方法
同步方法或者同步方法块都不能达到同步的作用。
@Service public class Service{ @Transactional(readOnly = false,rollbackFor = SQLException.class) public synchronized void synMethodOne() throws SQLException{ ............ } }
@Service public class Service{ @Transactional(readOnly = false,rollbackFor = SQLException.class) public void synMethodTwo() throws SQLException{ synchronized(this){ ............ } } }
2、修改后的方法
@Service public class noTransService { @Autowired SynchronizedService synchronizedService; public synchronized void synMethod() throws SQLException{ synchronizedService.synMethodTwo(); } } @Service public class SynchronizedService{ @Transactional(readOnly = false,rollbackFor = SQLException.class) public void synMethodTwo() throws SQLException{ ............ } }
相关文章推荐
- spring @transactional 和synchronized同时使用不能同步的问题
- spring注解与xml同时使用:bean命名问题及冲突
- spring注解与xml同时使用:bean命名问题及冲突
- spring注解与xml同时使用:bean命名问题及冲突
- Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation) Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)
- 在jdk1.7下使用spring的注解形式定义pointcut的问题
- WINCE USB使用一段时间后不能同步问题的修复
- Spring 下事务管理-使用AOP @Transactional注解管理
- 同时安装ASA10以及ASA11两个数据库导致不能使用SQLSERVER2005 management studio的问题解决
- Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)
- 被事务代理的spring service 不能使用注解方式发布dubbo服务
- 解决构选不确定问题,使用spring3注解
- Spring学习笔记——关于Spring注解扫描不能注入new对象问题
- Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)
- spring-mvc解决EL表达式不能使用问题
- Spring 下事务管理-使用AOP @Transactional注解管理
- 记录Java多线程的同步问题---synchronized关键字的使用
- spring3 mvc使用注解方式时,不能扫描jar包里面的类
- 解决VS2005 不能使用同步软件连接2440的问题
- 在Spring中同时使用XML和注解方式