Tagged: spring
A lesson of @Transactional
Recently, I needed to work with a Cursor for statistics.
<mapper ...> <select id="selectCorsor" resultOrdered="true"> </select> </mapper>
It didn’t make any difference.
@Mapper public interface SomeMapper { Cursor<Some> selectCursor(...); }
We need the @Transactional
annotation for working with Cursor
.
@Service public class SomeService { @Transactional public <R> R applyCursor( ..., final Function<Cursor<Some>, R> function) { return function.apply(someMapper.selectCursor(..)); } @Autowired private SomeMapper someMapper; }
Well the method worked as expected.
The problem arose when I added a method using the origin method.
public void acceptEach( ..., final Consumer<Some> consumer) { applyCursor( ..., cursor -> { cursor.forEach(consumer::accept); return null; } ); }
This auxiliary method was not annotated with @Transactional
and it didn’t work.
And I found @Transactional method calling another method without @Transactional anotation?.
The acceptEach
method was also required to be annotated with @Transactional
.