使用WWH方法来学习TransactionSynchronizationManager
- What 这个类是做什么的。
- Why 为什么需要它。
- How 如何使用它。
前置知识
1. What
是 Spring 中用于管理事务的核心类之一。它负责协调事务的各个部分,确保它们在事务执行期间保持一致性。具体来说,它管理事务的同步回调,包括在事务开始、提交或回滚时执行特定的操作。
简单来说,TransactionSynchronizationManager 可以让我们在事务的各个阶段执行不同的逻辑。
2. Why
在一个复杂的应用程序中,可能有多个数据库操作或者其他资源操作需要在一个事务中执行。TransactionSynchronizationManager
的存在可以确保这些操作在事务的上下文中得到正确的执行顺序和管理。这是确保数据完整性和一致性的重要机制。
3. How
在 Spring 应用程序中,你可以通过 TransactionSynchronizationManager
来注册事务同步回调,以便在事务的不同阶段执行特定的逻辑。通常情况下,你可以创建一个实现了 TransactionSynchronization
接口的类,然后在该类中定义在事务不同阶段需要执行的操作。最后,通过 TransactionSynchronizationManager.registerSynchronization()
方法注册这个类的实例即可。这样,在事务的不同阶段,TransactionSynchronizationManager
就会调用相应的回调方法,执行你定义的逻辑。
2. 应用场景
- 清理资源或关闭连接: 在某些情况下,你可能需要在事务提交或回滚后清理资源或关闭连接。例如,在一个事务中执行了一些文件操作或数据库连接操作,在事务提交或回滚后需要释放这些资源。你可以使用
TransactionSynchronizationManager
注册事务同步回调,在事务提交或回滚后执行资源清理操作。 - 发送消息或通知: 在一些分布式系统中,你可能需要在事务成功提交后发送消息或通知其他系统。例如,在订单支付成功后,你可能需要发送一个消息给库存系统,告知它更新库存。你可以使用
TransactionSynchronizationManager
在事务提交后发送这个消息。 - 缓存更新: 在一些高并发的系统中,你可能需要在事务提交后更新缓存以保持缓存与数据库的一致性。你可以使用
TransactionSynchronizationManager
注册事务同步回调,在事务提交后更新缓存。 - 异步任务: 在一些情况下,你可能需要在事务提交后执行一些耗时的异步任务,以提高系统的性能。你可以使用
TransactionSynchronizationManager
注册事务同步回调,在事务提交后启动这些异步任务。
3. 示例代码
1. 关闭资源
package spring.transaction.example;
import org.springframework.core.io.Resource;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import java.io.IOException;
/**
* <p>
* Example:Close Resource
* </p>
*
* @author shiqi
* @version 1.0.0
* @createTime 2024-04-28
*/
public class ResourceCleanupService {
public void registerResourceCleanup(final Resource resource) {
// Register a cleanup callback for the transaction.
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(int status) {
// After completion, the transaction is committed or rolled back.
if (status == STATUS_COMMITTED) {
try {
resource.getFile().delete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
}
2. 发送消息或通知
package spring.transaction.example;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* <p>
* Example: After Message sent
* </p>
*
* @author shiqi
* @version 1.0.0
* @createTime 2024-04-28
*/
public class MessageSenderService {
public void registerMessageSending(final String message){
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// After transaction commit, send the message
sendMessage(message);
System.out.println("Message sent: " + message);
}
});
}
public void sendMessage(String message){
// The logic to send the message
}
}
3. 更新缓存
package spring.transaction.example;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* <p>
* Example: CacheUpdateService
* </p>
*
* @author shiqi
* @version 1.0.0
* @createTime 2024-04-28
*/
public class CacheUpdateService {
public void registerCacheUpdate(final String key, final Object value) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// after transaction commit, update cache
updateCache(key, value);
}
});
}
private void updateCache(String key, Object value) {
// update cache logic
}
}
4.异步任务
package spring.transaction.example;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* <p>
* Example: AsyncTaskService
* </p>
*
* @author shiqi
* @version 1.0.0
* @createTime 2024-04-28
*/
@Service
public class AsyncTaskService {
@Async
public void registerAsyncTask(){
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// after commit, perform async task
performAsyncTask();
}
});
}
public void performAsyncTask() {
// perform async task
}
}