一:遇到的问题
导入excel表格中两条相同的数据,界面上显示了两条相同的数据,业务代码的处理是在保存数据库的时候是先查一次再保存的,数据库中有,则不保存,没有则保存,但是实际操作的效果是两条数据都保存到数据库。
二:解决的思路
看了下代码,看到方法上有个事务注解,估计跟这个事务有关系,在方法上加了@Transactional ,想着这个应该是一个事务里,100行在保存到数据库的时候 ,第二次循环过来98行去查的时候没有查到,说明第一次的数据还没有保存到库中。
三:修改验证
3.1:在100行的方法上重新加个新的事务,即每次调用这个方法的时候,是另外一个新的事务,但是看了下代码,这个是底层封装好的方法,我操作不了。
如果保存到数据的代码是自己写得,这个地方大家是不是可以加个@Transactional(propagation=Propagation.REQUIRES_NEW),这个大家遇到可以自己试下,我这就不试,提供一个思路。
3.2:那就将外面的方法上的事务去掉
3.3:其实这里应该还是代码写的有问题,这个代码是我写的,大家懂得,写代码就是ctrl+c,ctrl+v,里面做了try catch,那么这个注解其实不起作用的
将方法上的注解去掉后,再重新导入下这个数据,在界面上就达到了,自己想要的结果。
四:spring在方法上加事务的几个(温故而知新)
1:PROPAGATION_REQUIRED :支持当前事务,当前有事务就用当前的,没有就创建一个新的
2:PROPAGATION_REQUIRES_NEW :如果当前有事务,则创建一个新的事务,两个事务是独立的,互不影响,内部事务异常,外部可以捕获,外部事务不做回滚,也可以不捕获,这样外部事务会做回滚操作
3:PROPAGATION_SUPPORTS 支持当前事务,如果没有事务就以非事务的方式执行
4:PROPAGATION_MANDATORY 如果当前没有事务就抛异常
5:PROPAGATION_NOT_SUPPORTED 如果当前有事务就把当前事务挂起,以非事务的方式执行
6:PROPAGATION_NEVER(也不用) 就是没有事务,有事务就抛异常
7:PROPAGATION_NESTED(不用)