注意:TransactionCallbackWithoutResult是TransactionCallback的一个子类,用于没有返回值的情况。如果你需要返回值,可以使用TransactionCallback<T>。
方式二:使用DataSourceTransactionManager
这种方式更底层一些,直接使用事务管理器来获取事务状态,然后手动提交或回滚。
步骤:
a. 注入DataSourceTransactionManager
b. 使用TransactionDefinition定义事务属性(如隔离级别、传播行为等)
c. 获取事务状态(TransactionStatus)
d. 在try-catch块中执行操作,根据情况提交或回滚
示例代码:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition;@Service public class YourService {@Autowiredprivate PlatformTransactionManager transactionManager;public void manualTransactionWithManager() {// 定义事务属性DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);// 开启事务TransactionStatus status = transactionManager.getTransaction(def);try {// 这里执行你的数据库操作// yourMapper.insert(entity1);// yourMapper.update(entity2);// 操作成功,提交事务 transactionManager.commit(status);} catch (Exception e) {// 发生异常,回滚事务 transactionManager.rollback(status);throw e; // 可以选择抛出异常 }} }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition;@Service public class UserService {@Autowiredprivate PlatformTransactionManager transactionManager;@Autowiredprivate UserMapper userMapper;public void platformTransactionDemo() {// 定义事务属性DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);// 开启事务TransactionStatus status = transactionManager.getTransaction(def);try {// 执行数据库操作User user = new User();user.setName("王五");userMapper.insert(user);// 业务逻辑... userMapper.updateById(user);// 手动提交事务 transactionManager.commit(status);} catch (Exception e) {// 回滚事务 transactionManager.rollback(status);throw e;}} }