Tất cả các phương thức MyService đều được giao dịch. Các thử nghiệm junit dưới đây, được số mục, tiết kiệm một mục mới, và nhận được số mục để đảm bảo rằng số lượng đã được tăng lên bằng cách 1.Spring @transaction không hoạt động như mong đợi ở junit ở chế độ không gỡ lỗi
public class MyTest extends ServiceTest{
1. int countBefore = myService.getCount(); //return n
2. myService.add(item); //item is really added to DB
3. int countAfter = myService.getCount(); //return n (sometimes n+1)
}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED)
getCount(){…}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE)
add(){…}
@Ignore
@ContextConfiguration(locations = { "file:src/main/resources/xxx-context.xml",
"file:src/main/resources/xxx-data.xml",
"file:src/main/resources/xxx-services.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
TestListener.class})
public class ServiceTest extends AbstractUT{
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({TestListener.class})
public class AbstractUT{
Khi gỡ lỗi (3.) trả về n + 1 là những gì tôi muốn. Nhưng khi chạy thử nghiệm mà không gỡ lỗi tôi nhận được n.
Thậm chí đôi khi chạy thử nghiệm tôi nhận được n + 1 và lần sau tôi nhận được n và khi so sánh đầu ra std giữa hai lần thực hiện, nó trông giống hệt nhau. Tôi đã kích hoạt log4j.logger.org.springframework.transaction = TRACE và tôi có thể thấy:
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.add
...
Completing transaction for MyService.add
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
Vì vậy, giao dịch đang được thực hiện một sau khi khác, nhưng làm thế nào có thể là (3) không thấy mục đã lưu?
giao dịch managment được thiết lập trong lớp học thử nghiệm của tôi theo: https://stackoverflow.com/a/28657650/353985
Làm thế nào tôi có thể tìm thấy những gì đang xảy ra vậy? Cảm ơn!
Bạn có sử dụng ' ' không? anyway xem câu trả lời của tôi trên [liên kết này] (http://stackoverflow.com/a/25910635/3364187). –
Xstian
Hoàn toàn có. – redochka
Bạn có thể thêm cấu hình và TestClass của mình không? – Xstian