Synchronized锁在Spring事务管理下,为啥还线程不安全?(2)
发布时间:2019-03-15 16:30 所属栏目:21 来源:Java3y
导读:我们知道Spring事务的底层是Spring AOP,而Spring AOP的底层是动态代理技术。跟大家一起回顾一下动态代理: publicstaticvoidmain(String[]args){ //目标对象 Objecttarget; Proxy.newProxyInstance(ClassLoader.ge
我们知道Spring事务的底层是Spring AOP,而Spring AOP的底层是动态代理技术。跟大家一起回顾一下动态代理:
(详细请参考我之前写过的动态代理:给女朋友讲解什么是代理模式) 实际上Spring做的处理跟以上的思路是一样的,我们可以看一下TransactionAspectSupport类中invokeWithinTransaction(): 调用方法前开启事务,调用方法后提交事务 在多线程环境下,就可能会出现:方法执行完了(synchronized代码块执行完了),事务还没提交,别的线程可以进入被synchronized修饰的方法,再读取的时候,读到的是还没提交事务的数据,这个数据不是最新的,所以就出现了这个问题。 三、解决问题从上面我们可以发现,问题所在是因为@Transcational注解和synchronized一起使用了,加锁的范围没有包括到整个事务。所以我们可以这样做: 新建一个名叫SynchronizedService类,让其去调用addEmployee()方法,整个代码如下:
(编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读