什么是事务?
我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行 的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成, 之前成功操作数据的并不可靠,需要在这种情况下进行回退。
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就 回退到事务开始未进行操作的状态。
事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务。
eg:A转账给B,A转出去正常,B接收异常-----就不可以成功,就需要回退到A没有转账的状态。
1.创建service/UserService
package com.cc.springboot.service;
import com.cc.springboot.entity.User;
public interface UserService {
Boolean addUser(User user);
}
? 定义了一个接口方法
2. 使用service,创建service/impl/UserServiceImple
package com.cc.springboot.service.impl;
import com.cc.springboot.dao.Repository;
import com.cc.springboot.entity.User;
import com.cc.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
//模拟事务管理
@Service
public class UserServiceImple implements UserService {
@Autowired
Repository repository;
@Transactional //当前方法开启事务管理
@Override
public Boolean addUser(User user) {
// 模拟转账:转出
repository.save(new User("a","1"));
repository.save(new User("aa","1"));
repository.save(new User("aaa","1"));
repository.save(new User("aaa","1"));
repository.save(new User("aaaa","1"));
// 转入:模拟失败
repository.save(new User("cccccc","1"));
repository.save(new User("ccccccccc","1"));
repository.save(user);
return null;
}
}
?注入的dao相当于数据库操作
?
?3.controller/UserController测试
package com.cc.springboot.controller;
import com.cc.springboot.dao.Repository;
import com.cc.springboot.entity.User;
import com.cc.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/user2")
public User addUser2(User user){
userService.addUser(user);
return user;
}
}
事务的步骤
1.在启动类上 ,使用 @EnableTransactionManagement?开启注解方式事务支持
2.在 Service层方法上添加 @Transactional?进行事务管理(不需要在表头,一般查看不需要事务)
3.如果使用 JPA?创建表则需要指定数据库引擎为 Innodb
配置文件中添加:database-platform: org.hibernate.dialect.MySQL57Dialect
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
#jpa相关配置
jpa:
hibernate:
#会根据映射实体类自动创建或更新数据表
ddl-auto: update
#控制台打印sql语句
show-sql: true
# 8指定如下方言: 创建的表类型是Innodb,才可以进行对事物的回滚。
database-platform: org.hibernate.dialect.MySQL57Dialect
?
总结:
? entity-----------》数据库表的字段(getter,setter,构造方法)
? dao-----------》数据库操作(和数据库打交道,需要entity)
? service--------》事务管理(封装具体的业务,一个接口,定义方法)
? service-impl------》实现service(需要dao注入)
? controller--------》注入service,具体操作。(访问路径,怎样的增删改查)?
dao和service举例理解
dao封装了用户的增删改查。而业务上要求批量删除用户,Service就可以封装出一个批量删除用户的功能,但是实现只是循环调用dao的单个删除
|