日期:2014-05-18  浏览次数:20601 次

请教一个关于Spring的事务的问题。
请教一个关于Spring的事务的问题。
下面这段代码放到多线程里,为什么会出现“主键重复”异常?
也就是这段代码并没有作为一段原子代码块运行。


@Transactional
private void UpdateServerDiskData(List<Data> datas){
try
{    
this.serverDiskDao.DeleteAllData();    
for(Data data : datas  ){
this.dao.InsertData(data);    
}
}catch(Exception e){
e.printStackTrace();    
}
}


用下面这样同步就没问题:

@Transactional
private void UpdateServerDiskData(List<Data> datas){
try
{    
synchronized(lockObj){
this.serverDiskDao.DeleteAllData();    
for(Data data : datas  ){
this.dao.InsertData(data);    
}
}
}catch(Exception e){
e.printStackTrace();    
}
}


------解决方案--------------------
@Transactional 只针对 public方法起作用
------解决方案--------------------
2楼正解,你的事物注解没起作用,你改成public去掉同步关键字就不会出现了
------解决方案--------------------
引用:
2楼正解,你的事物注解没起作用,你改成public去掉同步关键字就不会出现了

不一定吧, 它这里的@Transactional 不起作用,不代表这个方法没有事务,它如果运行在其它事务方法中也一样可以保存数据。
所以不太清楚楼主是什么问题

------解决方案--------------------
引用:
Quote: 引用:

2楼正解,你的事物注解没起作用,你改成public去掉同步关键字就不会出现了

不一定吧, 它这里的@Transactional 不起作用,不代表这个方法没有事务,它如果运行在其它事务方法中也一样可以保存数据。
所以不太清楚楼主是什么问题

恩,的确,疏忽了,只是@transaction没气作用