君子择交,莫恶于易与,莫善于胜己。——王夫之
有时候我们需要在事务执行前后执行一些代码,这时候可以使用事务同步器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import org.springframework.transaction.support.TransactionSynchronization;
public class MyTransactionSynchronization implements TransactionSynchronization {
@Override public void beforeCommit(boolean readOnly) { System.out.println("Before commit"); }
@Override public void beforeCompletion() { System.out.println("Before completion"); }
@Override public void afterCommit() { System.out.println("After commit"); }
@Override public void afterCompletion(int status) { if (status == STATUS_COMMITTED) { System.out.println("Transaction committed"); } else if (status == STATUS_ROLLED_BACK) { System.out.println("Transaction rolled back"); } } }
|
注册事务同步器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RequestMapping("/api") public class MyController {
@GetMapping("/test") public String test() { List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations(); boolean alreadyRegistered = synchronizations.stream() .anyMatch(sync -> sync instanceof MyTransactionSynchronization);
if (!alreadyRegistered) { TransactionSynchronizationManager.registerSynchronization(new MyTransactionSynchronization()); }
return "Test completed"; } }
class MyTransactionSynchronization implements TransactionSynchronization { @Override public void afterCompletion(int status) { if (status == STATUS_COMMITTED) { System.out.println("Transaction committed"); } else { System.out.println("Transaction rolled back"); } }
@Override public void beforeCommit(boolean readOnly) { System.out.println("Before commit"); }
@Override public void beforeCompletion() { System.out.println("Before completion"); }
@Override public void afterCommit() { System.out.println("After commit"); } }
|