springboot 事务使用示例
使用示例
*********
配置文件
application.yml
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3307/lihu?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
mybatis-plus:
mapper-locations: classpath:/mappers/*.xml
type-aliases-package: com.example.demo.pojo
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
*********
pojo 层
Person
@Getter
@Setter
@ApiModel(value = "Person对象", description = "")
public class Person extends Model<Person> {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
@Override
public Serializable pkVal() {
return this.id;
}
}
*********
config 层
DataConfig
@Configuration
@MapperScan("com.example.demo.dao")
public class DataConfig {
@Bean
public MybatisPlusInterceptor initMybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor =new OptimisticLockerInnerInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);
return mybatisPlusInterceptor;
}
}
*********
service 层
PersonService
public interface PersonService extends IService<Person> {
void savePerson(Person person);
}
*********
service.impl 层
PersonServiceImpl
@Service
public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person> implements PersonService {
@Resource
private PersonMapper personMapper;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void savePerson(Person person) {
personMapper.insert(person);
if (person.getAge().equals(16)){
throw new RuntimeException("id为"+16+"的数据插入失败");
}
}
}
*********
controller 层
PersonController
@RestController
@RequestMapping("/person")
public class PersonController {
@Resource
private PersonService personService;
@RequestMapping("/hello")
public String hello(){
for (int i=0;i<10;i++){
Person person = new Person();
person.setName("瓜田李下 "+i);
person.setAge(10+i);
try {
personService.savePerson(person);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
return "hello";
}
}
使用测试
localhost:8080/hello,控制台输出:
# 事务1提交
# 创建事务
2022-04-29 12:04:10.371 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
# 获取数据库连接
2022-04-29 12:04:10.582 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
# 切换事务到手动提交
2022-04-29 12:04:10.585 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
# 初始化事务提交
2022-04-29 12:04:10.665 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
# 提交事务
2022-04-29 12:04:10.665 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
# 释放事务
2022-04-29 12:04:10.674 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务2提交
2022-04-29 12:04:10.674 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.674 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.674 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.680 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.680 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.685 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务3提交
2022-04-29 12:04:10.685 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.685 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.685 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.691 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.691 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.695 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务4提交
2022-04-29 12:04:10.696 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.696 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.696 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.701 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.701 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.706 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务5提交
2022-04-29 12:04:10.706 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.706 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.707 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.713 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.713 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.718 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务6提交
2022-04-29 12:04:10.718 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.718 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.718 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.725 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.725 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.730 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务7回滚
# 创建事务
2022-04-29 12:04:10.731 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
# 获取数据库连接
2022-04-29 12:04:10.731 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
# 切换事务到手动提交
2022-04-29 12:04:10.731 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
# 初始化事务回滚
2022-04-29 12:04:10.737 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction rollback
# 事务回滚
2022-04-29 12:04:10.737 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Rolling back JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
# 释放事务
2022-04-29 12:04:10.742 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
id为16的数据插入失败
# 事务8提交
2022-04-29 12:04:10.743 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.743 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.743 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.748 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.749 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.754 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务9提交
2022-04-29 12:04:10.754 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.754 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.754 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.759 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.760 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.765 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction
# 事务10提交
2022-04-29 12:04:10.765 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Creating new transaction with name [com.example.demo.service.impl.PersonServiceImpl.savePerson]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
2022-04-29 12:04:10.765 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Acquired Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] for JDBC transaction
2022-04-29 12:04:10.765 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Switching JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] to manual commit
2022-04-29 12:04:10.771 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Initiating transaction commit
2022-04-29 12:04:10.771 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Committing JDBC transaction on Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc]
2022-04-29 12:04:10.776 DEBUG 2726 --- [nio-8080-exec-1] o.s.jdbc.support.JdbcTransactionManager : Releasing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7a79abcc] after transaction