本文主要介绍Spring中的事务相关知识:
1、熟悉事务管理的三个核心接口
2、了解Spring事务的两种方式
3、掌握基于XML和注解的事务使用
PlatformTransactionManage接口是Spring平台提供的平台事务管理器,主要用于管理事务。该接口中主要包含3个事务操作方法。
mysql mysql-connector-java 5.1.45 runtime com.alibaba druid 1.1.9 org.mybatis mybatis 3.4.5 org.mybatis mybatis-spring 1.3.1 org.slf4j slf4j-log4j12 1.7.25 org.springframework spring-jdbc 5.0.8.RELEASE org.aspectj aspectjweaver 1.8.13 org.springframework spring-webmvc 5.0.8.RELEASE org.springframework spring-test 5.0.8.RELEASE test junit junit 4.12 test org.projectlombok lombok 1.18.22 provided
CREATE TABLE `account` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`balance` decimal(10, 0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;INSERT INTO `account` VALUES (1, 10000);
INSERT INTO `account` VALUES (2, 0);
package cn.simplelife.mapper;import org.apache.ibatis.annotations.Param;import java.math.BigDecimal;/*** @ClassName AccountMapper* @Description* @Author simplelife* @Date 2022/11/23 15:34* @Version 1.0*/public interface AccountMapper {void addBalance(@Param("inId") Long inId, @Param("amount") BigDecimal amount);void subtractBalance(@Param("outId") Long outId, @Param("amount") BigDecimal amount);
}
UPDATE accountSET balance=balance + #{amount}WHERE id = #{inId} UPDATE accountSET balance=balance - #{amount}WHERE id = #{outId}
package cn.simplelife.domain;import lombok.Data;import java.math.BigDecimal;/*** @ClassName Account* @Description* @Author simplelife* @Date 2022/11/23 15:15* @Version 1.0*/
@Data
public class Account {private Long id;private BigDecimal balance;
}
package cn.simplelife.service;import java.math.BigDecimal;/*** @ClassName IAccountService* @Description* @Author simplelife* @Date 2022/11/23 17:09* @Version 1.0*/public interface IAccountService {void transfer(Long outId, Long inId, BigDecimal amount);
}
package cn.simplelife.service.impl;import cn.simplelife.mapper.AccountMapper;
import cn.simplelife.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.math.BigDecimal;/*** @ClassName IAccountServiceImpl* @Description* @Author simplelife* @Date 2022/11/23 17:10* @Version 1.0*/@Service
public class IAccountServiceImpl implements IAccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transfer(Long outId, Long inId, BigDecimal amount) {accountMapper.subtractBalance(outId, amount);System.out.println(10 / 0);accountMapper.addBalance(inId, amount);}
}
import cn.simplelife.service.IAccountService;
import cn.simplelife.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.math.BigDecimal;/*** @ClassName SqlSessionFactoryTest* @Description* @Author simplelife* @Date 2022/11/23 15:26* @Version 1.0*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SqlSessionFactoryTest {@Autowiredprivate IAccountService iAccountService;@Testpublic void getSqlSessionTest() {System.out.println(MybatisUtils.getSqlSession());iAccountService.transfer(1L, 2L, new BigDecimal("100"));}
}
添加注解
package cn.simplelife.service.impl;import cn.simplelife.mapper.AccountMapper;
import cn.simplelife.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.math.BigDecimal;/*** @ClassName IAccountServiceImpl* @Description* @Author simplelife* @Date 2022/11/23 17:10* @Version 1.0*/@Service
public class IAccountServiceImpl implements IAccountService {@Autowiredprivate AccountMapper accountMapper;@Override@Transactionalpublic void transfer(Long outId, Long inId, BigDecimal amount) {accountMapper.subtractBalance(outId, amount);System.out.println(10 / 0);accountMapper.addBalance(inId, amount);}
}