一、事务不生效
情况一:抛出非运行时异常
业务代码:
@Override
@Transactional
public void crossDatabaseTransactional(String name) throws DivideByZeroException {
List<User> users = new LinkedList<>();
User user = new User();
user.setName("qqqqq");
users.add(user);
Integer r2 = secondUserMapper.insertUsers(users);
Integer r3 = thirdUserMapper.insertUsers(users);
if(2==2){
throw new DivideByZeroException();
}
}
测试代码:
@Test
void testCrossDatabaseTransactional() throws DivideByZeroException {
userService.crossDatabaseTransactional("王源");
}
错误详情:
运行代码后事务不生效,即使发生了错误也无法回滚,数据仍然插入成功。
解决方法:
方法一:
将异常类继承RuntimeException,异常类代码修改如下:
public class DivideByZeroException extends RuntimeException {
}
此时事务生效,都没有插入成功
方法二:
不抛出异常,用@SneakyThrows注解处理异常,业务代码修改如下:
@SneakyThrows
@Override
@Transactional
public void crossDatabaseTransactional(String name) {
List<User> users = new LinkedList<>();
User user = new User();
user.setName("qqqqq");
users.add(user);
Integer r2 = secondUserMapper.insertUsers(users);
Integer r3 = thirdUserMapper.insertUsers(users);
if(2==2){
throw new DivideByZeroException();
}
}
二、无法插入数据
情况一:调用方使用@Transactional注解
业务代码:
@SneakyThrows
@Override
@Transactional
public void crossDatabaseTransactional(String name) {
List<User> users = new LinkedList<>();
User user = new User();
user.setName("qqqqq");
users.add(user);
Integer r2 = secondUserMapper.insertUsers(users);
Integer r3 = thirdUserMapper.insertUsers(users);
}
测试代码:
@Test
@Transactional
void testCrossDatabaseTransactional() {
userService.crossDatabaseTransactional("王源");
}
错误详情:
运行插入语句后数据库没有对应数据。
错误原因:
调用方使用@Transactional注解
解决方法:
方法一:
调用方删去@Transactional注解,代码如下:
@Test
void testCrossDatabaseTransactional() {
userService.crossDatabaseTransactional("王源");
}
方法二:
修改调用方事务传播级别为SUPPORTS,代码如下:
@Test
@Transactional(propagation = Propagation.SUPPORTS)
void testCrossDatabaseTransactional() {
userService.crossDatabaseTransactional("王源");
}