添加评论 要用到事务管理方面内容
接下来详解 第一类丢失更新
面试的时候,这几种异常都要讲清楚。
在AlphaService实现:
@Autowired
private UserMapper userMapper;//注入用户
@Autowired
private DiscussPostMapper discussPostMapper;//注入帖子
可以看到 Propagation 一共有七个值
// REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
// REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
// NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)//READ_COMMITTED,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);//将uesr插入库
// 新增帖子
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";
}
新建一个测试类:TransactionTests
package com.nowcoder.community;
import com.nowcoder.community.service.AlphaService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class TransactionTests {
@Autowired
private AlphaService alphaService;//因为要测试的是alphaService代码,所以要将其注入
@Test
public void testSave1() {
Object obj = alphaService.save1();
System.out.println(obj);
}
发现结果是错误的,而且数据添加至数据库失败,
说明:程序执行异常,完整回滚,保证了业务的完整性。
另一种方式:编程式事务
还是在alphaService中
@Autowired
private TransactionTemplate transactionTemplate;
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";
}
});
}
然后在TransactionTests 新建测试类
@Test
public void testSave2() {
Object obj = alphaService.save2();
System.out.println(obj);
}
}
还是报刚刚的错误 ,且均未添加成果
意味着其成功回滚,
意味着管理事务是没有问题的