文章目录
![在这里插入图片描述](https://img-blog.csdnimg.cn/947eea29106644248948415e6af115ee.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/cea019b7e3954afc84eaddf7d4311950.png)
1. 常见并发异常
1.1 第一类丢失更新
1.2 第二类丢失更新
1.3 脏读
1.4 不可重复读
1.5 幻读
2. 事务隔离级别
3. 实现机制
4. Spring事务管理
5. 模拟事务
需求:注册一个用户,系统自动为他发一个帖子“新人报道”
5.1 声明式事务
- 在AlphaService创建新业务
① 新增用户
② 增加帖子
③ 增加注解 @Transactional,设置隔离级别 isolation = Isolation.READ_COMMITTED,传播机制 propagation = Propagation.REQUIRED
@Autowired
private UserMapper userMapper;
@Autowired
private DiscussPostMapper discussPostMapper;
// REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
// REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
// NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public Object save1() {
// 新增用户
User user = new User();
user.setUsername("alpha");
user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
user.setEmail("alpha@qq.com");
user.setHeaderUrl("http://image.nowcoder.com/head/99t.png");
user.setCreateTime(new Date());
userMapper.insertUser(user);
// 新增帖子
DiscussPost post = new DiscussPost();
post.setUserId(user.getId());
post.setTitle("Hello");
post.setContent("新人报道!");
post.setCreateTime(new Date());
discussPostMapper.insertDiscussPost(post);
//主动加错看事务是否回滚
Integer.valueOf("abc");
return "ok";
}
- 测试
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class TransactionTests {
@Autowired
private AlphaService alphaService;
@Test
public void testSave1() {
Object obj = alphaService.save1();
System.out.println(obj);
}
}
5.2 编程式事务
- transactionTemplate.setIsolationLevel:设置隔离级别
- transactionTemplate.setPropagationBehavior:设置传播级别
- 调用方法 execute ,匿名实现接口TransactionCallback,回调方法
public Object save2() {
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
// 新增用户
User user = new User();
user.setUsername("beta");
user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
user.setEmail("beta@qq.com");
user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
user.setCreateTime(new Date());
userMapper.insertUser(user);
// 新增帖子
DiscussPost post = new DiscussPost();
post.setUserId(user.getId());
post.setTitle("你好");
post.setContent("我是新人!");
post.setCreateTime(new Date());
discussPostMapper.insertDiscussPost(post);
Integer.valueOf("abc");
return "ok";
}
});
}
- 测试
@Test
public void testSave2() {
Object obj = alphaService.save2();
System.out.println(obj);
}