Como em qualquer regra, acho que o importante aqui é considerar o objetivo da regra, o espírito, e não se envolver na análise exata de como a regra foi redigida em algum livro e como aplicá-la a esse caso. Não precisamos abordar isso como advogados. O objetivo das regras é ajudar-nos a escrever programas melhores. Não é como se o objetivo de escrever programas fosse manter as regras.
O objetivo da regra de responsabilidade única é tornar os programas mais fáceis de entender e manter, fazendo com que cada função faça uma coisa coerente e independente.
Por exemplo, uma vez eu escrevi uma função que chamei de algo como "checkOrderStatus", que determinava se um pedido estava pendente, enviado, com pedido pendente, o que fosse, e retornava um código indicando qual. Em seguida, outro programador apareceu e modificou essa função para também atualizar a quantidade disponível quando o pedido foi enviado. Isso violou severamente o princípio da responsabilidade única. Outro programador que lesse esse código posteriormente veria o nome da função, veria como o valor de retorno foi usado e pode muito bem nunca suspeitar que fez uma atualização do banco de dados. Alguém que precisasse obter o status do pedido sem atualizar a quantidade disponível estaria em uma posição embaraçosa: ele deveria escrever uma nova função que duplique a parte do status do pedido? Adicione um sinalizador para informar se é necessário fazer a atualização do banco de dados? Etc.
Por outro lado, eu não escolheria o que constitui "duas coisas". Recentemente, escrevi uma função que envia informações do cliente do nosso sistema para o sistema do cliente. Essa função faz alguma reformatação dos dados para atender aos seus requisitos. Por exemplo, temos alguns campos que podem ser nulos em nosso banco de dados, mas eles não permitem nulos; portanto, precisamos preencher algum texto fictício "não especificado" ou esqueci as palavras exatas. Indiscutivelmente, essa função está fazendo duas coisas: reformate os dados E envie-os. Mas eu deliberadamente coloquei isso em uma única função, em vez de "reformatar" e "enviar", porque eu não quero nunca, nunca envie sem reformatar. Não quero que alguém escreva uma nova ligação e não perceba que ele precisa ligar para reformatar e depois enviar.
No seu caso, atualize o banco de dados e retorne uma imagem do registro gravado, como duas coisas que podem muito bem logicamente e inevitavelmente. Como não conheço os detalhes do seu aplicativo, não posso dizer definitivamente se essa é uma boa ideia ou não, mas parece plausível.
Se você estiver criando um objeto na memória que armazena todos os dados do registro, fazendo as chamadas do banco de dados para gravar isso e depois retornando o objeto, isso faz muito sentido. Você tem o objeto em suas mãos. Por que não devolvê-lo? Se você não retornou o objeto, como o chamador o conseguiu? Ele teria que ler o banco de dados para obter o objeto que você acabou de escrever? Isso parece bastante ineficiente. Como ele encontraria o registro? Você conhece a chave primária? Se alguém declarar que é "legal" a função de gravação retornar a chave primária para que você possa reler o registro, por que não retornar apenas o registro inteiro para que você não precise? Qual é a diferença?
Por outro lado, se a criação do objeto é um trabalho bastante distinto da gravação do registro do banco de dados, e um chamador pode querer fazer a gravação, mas não criar o objeto, isso pode ser um desperdício. Se um chamador desejar o objeto, mas não gravar, será necessário fornecer outra maneira de obtê-lo, o que pode significar a escrita de código redundante.
Mas acho que o cenário 1 é mais provável, então eu diria que provavelmente não há problema.