SpringFramework:@Transactional(readOnly=true)不使用h2

SpringFramework:@Transactional(readOnly=true)不使用h2,spring,spring-data,h2,spring-transactions,Spring,Spring Data,H2,Spring Transactions,我正在使用SpringFramework进行事务测试。 我有以下课程 UserService.class @Transactional public interface UserService { void add(User user); @Transactional(readOnly = true) User get(String id); @Transactional(readOnly = true) List<User> getAll

我正在使用SpringFramework进行事务测试。 我有以下课程

UserService.class

@Transactional
public interface UserService {
    void add(User user);

    @Transactional(readOnly = true)
    User get(String id);

    @Transactional(readOnly = true)
    List<User> getAll();

    void deleteAll();

    void update(User user);
}
public class UserServiceImpl implements UserService {
    // skip some methods
    @Override public void update(User user) { userDao.update(user); }
}
public class TestUserService extends UserServiceImpl {
    @Override
    public List<User> getAll() {
        for (User user : super.getAll()) {
            // try to update in get* method. it's read-only. 
            super.update(user);
        }
        return null;
    }
}
TestUserService.class

@Transactional
public interface UserService {
    void add(User user);

    @Transactional(readOnly = true)
    User get(String id);

    @Transactional(readOnly = true)
    List<User> getAll();

    void deleteAll();

    void update(User user);
}
public class UserServiceImpl implements UserService {
    // skip some methods
    @Override public void update(User user) { userDao.update(user); }
}
public class TestUserService extends UserServiceImpl {
    @Override
    public List<User> getAll() {
        for (User user : super.getAll()) {
            // try to update in get* method. it's read-only. 
            super.update(user);
        }
        return null;
    }
}
此测试代码是使用mysql时的一个成功案例。但当使用内存中的H2数据库时失败。这是因为事务完成时没有异常

我阅读了Spring框架文档,发现了以下内容:

这只是作为实际事务子系统的提示;它不一定会导致写入访问尝试失败。无法解释只读提示的事务管理器在请求只读事务时不会引发异常,而是默默地忽略该提示


但是我想知道是否有办法通过H2数据库的测试。

只读只是一个提示(如文档中所述)。如果您想在不使用该标志的数据库中处理该问题,则需要修改jdbc驱动程序。这可能是你不想做的。@M.Deinum谢谢!