在 Wildfly 上的 MyBatis 中使用 REQUIRES_NEW JTA 事务类型
Using REQUIRES_NEW JTA transaction type in MyBatis on Wildfly
我正在尝试在 Wildfly 中使用 mybatis-cdi,我需要 运行 在单独的事务中使用部分方法 - 请参阅以下代码段:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ItemService {
@Inject
@Mapper
ItemMapper mapper;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomething() {
List<Item> items = mapper.findByTime(new Date());
for(Item i : items) {
update(i);
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void update(Item item) {
mapper.updateSomehow(item);
}
}
这是正确的方法吗? mybatis-cdi 是否支持此功能,还是应该以其他方式完成?
您没有得到预期的行为,因为在方法中使用自引用时未应用拦截器,例如 doSomething()
如何直接调用 update()
。您需要在单独的 bean 中进行,以允许单独的事务交互。
您可以将 EJB 注入自身以便通过代理调用它:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
class ItemService {
@Inject
@Mapper
private ItemMapper mapper;
@Inject // or @EJB
private ItemService itemService;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomething() {
List<Item> items = mapper.findByTime(new Date());
for (Item i : items) {
itemService.update(i); // here's the trick
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void update(Item item) {
mapper.updateSomehow(item);
}
}
我正在尝试在 Wildfly 中使用 mybatis-cdi,我需要 运行 在单独的事务中使用部分方法 - 请参阅以下代码段:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ItemService {
@Inject
@Mapper
ItemMapper mapper;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomething() {
List<Item> items = mapper.findByTime(new Date());
for(Item i : items) {
update(i);
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void update(Item item) {
mapper.updateSomehow(item);
}
}
这是正确的方法吗? mybatis-cdi 是否支持此功能,还是应该以其他方式完成?
您没有得到预期的行为,因为在方法中使用自引用时未应用拦截器,例如 doSomething()
如何直接调用 update()
。您需要在单独的 bean 中进行,以允许单独的事务交互。
您可以将 EJB 注入自身以便通过代理调用它:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
class ItemService {
@Inject
@Mapper
private ItemMapper mapper;
@Inject // or @EJB
private ItemService itemService;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomething() {
List<Item> items = mapper.findByTime(new Date());
for (Item i : items) {
itemService.update(i); // here's the trick
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void update(Item item) {
mapper.updateSomehow(item);
}
}