springboot的事务是指对于数据库的操作,mysql数据库事务有acid特性
a:原子性 c:一致性 i:隔离性 d:持久性
如下是一个User 类
@Entity
@Data
@Table(name="t_user")
public class User {
@Id
private int id;
@Column(nullable = false, length = 5)
private String name;
private int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
}
Repository类
public interface UserRepository extends JpaRepository<User,Integer>{
}
service类
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void testTranscation() {
userRepository.save(new User("tom",10));
userRepository.save(new User("tom111111",11));
}
}
测试类:
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testTranscation() {
userService.testTranscation();
}
}
由于user的name属性不能为null,当name为null时会抛出异常,但是null前save的成功插入了
userRepository.save(new User("tom",10));
userRepository.save(new User(null,11));
如果我们在service上加@Transactional,虽然还是会抛出异常,但是new User("tom",10)不会成功执行,一旦抛出异常整个方法会rollback,注意启动类上不要忘记使用@EnableTransactionManagement,否则事务不会开启
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void testTranscation() {
userRepository.save(new User("tom", 10));
userRepository.save(new User(null, 11));
}
}
@Transactional使用在方法上只针对这个方法,也可注解在类上,该类下的所有方法都被注解