sqlserver数据库
操作sqlserver数据库时,比如新增、更新操作。而当sqlserver出现错误或异常时,需要将已经执行的操作撤回。
- 在service层中设置数据库的回滚
通过@Transactional注解
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
@Transactional(rollbackFor = Exception.class)
public int addUser(User user) {
try {
// 添加user1
userMapper.addUser(user);
// 添加user2 重复添加相同数据,此时出现"主键重复"错误
userMapper.addUser(user);
} catch (Exception e) {
//e.printStackTrace();
// 数据库回滚操作
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return 0;
}
// 添加成功后,将数据写入redis数据库
redisTemplate.opsForHash().put("userHash", user.getId(), user);
return 1;
}
}
当没有使用“TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();”执行回滚操作时,“添加user1”的语句已经执行,数据库中存在user1的数据。使用回滚操作后,因为“添加user2”出现异常,虽然“添加user1”执行成功,但user1没有写入数据库。
- 启动类中需要添加注解@EnableTransactionManagement
@SpringBootApplication
@EnableTransactionManagement
public class StartApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(StartApplication.class, args);
}
}
redis缓存
当执行新增或修改操作出现异常时,sqlserver数据库没有操作成功,但redis数据库已经成功插入修改数据,此时需要回滚redis事务。
@Transactional(rollbackFor = Exception.class)
public int addUser(User user) {
// 开启事务权限
redisTemplate.setEnableTransactionSupport(true);
try {
// 开启事务
redisTemplate.multi();
// 操作sqlserver数据库
userMapper.addUser(user);
// 操作redis数据库
redisTemplate.opsForHash().put("userHash", user.getId(),user);
// 抛出异常
int error = 1/0;
// redis事务执行
redisTemplate.exec();
return 1;
} catch (Exception e) {
e.printStackTrace();
// redis回滚事务
redisTemplate.discard();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return 0;
}
}