事务管理一般用于确保数据的统一性和一致性,一个转账的例子很能说明。
比如甲给乙转1000元钱,首先是从数据库中将甲的钱减少1000,然后再去将乙的钱增加1000,但是如果这个时间段,突然出现异常,比如机房停电了。可能会出现甲的钱少了,乙却没收到钱,那笔钱就随异常消失了。如果使用事务管理,则不会出现上述情况。
事务的四个关键属性(ACID)
① 原子性(atomicity):事务室一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
② 一致性(consistency):一旦所有事务动作完成,事务就被提交。数据和资源就处于一种满足业务规则的一致性状态中
③ 隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏
④ 持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中
下面通过一个例子,同时添加两个用户的方式来测试SpringBoot的事务管理。
1、UserRepository
2、UserService.java
注意 @Transactional 注解,如果没有这个注解,一旦遇到异常,不能保证两个用户同时添加成功或者同时失败
3、UserController.java
比如甲给乙转1000元钱,首先是从数据库中将甲的钱减少1000,然后再去将乙的钱增加1000,但是如果这个时间段,突然出现异常,比如机房停电了。可能会出现甲的钱少了,乙却没收到钱,那笔钱就随异常消失了。如果使用事务管理,则不会出现上述情况。
事务的四个关键属性(ACID)
① 原子性(atomicity):事务室一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
② 一致性(consistency):一旦所有事务动作完成,事务就被提交。数据和资源就处于一种满足业务规则的一致性状态中
③ 隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏
④ 持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中
下面通过一个例子,同时添加两个用户的方式来测试SpringBoot的事务管理。
1、UserRepository
- package com.liuyanzhao.blog;
- import org.springframework.data.jpa.repository.JpaRepository;
- /**
- * @Author 言曌
- * @DATE 2017/10/29 上午10:35
- * @URL http://liuyanzhao.com
- */
- public interface UserRepository extends JpaRepository<User,Integer>{//表名和Id类型
- }
2、UserService.java
- package com.liuyanzhao.blog;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- /**
- * @Author 言曌
- * @DATE 2017/10/29 下午9:02
- * @URL http://liuyanzhao.com
- */
- @Service
- public class UserService {
- @Autowired
- private UserRepository userRepository;
- @Transactional
- public void insertTwo() {
- User user = new User();
- user.setName("Tom");
- user.setAge(7);
- user.setGender("男");
- userRepository.save(user);
- User user2 = new User();
- user2.setName("Jerry");
- user2.setAge(5);
- user2.setGender("女");
- userRepository.save(user2);
- }
- }
注意 @Transactional 注解,如果没有这个注解,一旦遇到异常,不能保证两个用户同时添加成功或者同时失败
3、UserController.java
- package com.liuyanzhao.blog;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
- /**
- * @Author 言曌
- * @DATE 2017/10/29 上午10:33
- * @URL http://liuyanzhao.com
- */
- @RestController
- public class UserController {
- @Autowired UserService userService;
- @PostMapping(value = "/users/two")
- public void insertTwo() {
- userService.insertTwo();
- }
- }
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏