数据库保障事务的机制如下
spring事务管理
在业务层模拟某个业务,注册用户和自动发送新人报到帖这两个业务视作一个事务
代码如下(两种方法):
@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());
dicussPostMapper.insertDiscussPost(post);
Integer.valueOf("abc");
return "abc";
}
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 transactionStatus) {
//新增用户
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());
dicussPostMapper.insertDiscussPost(post);
Integer.valueOf("abc");
return "abc";
}
});
}
在测试类中分别对两种方法进行测试,由于Integer.valueOf("abc");
报错,该事务失败应该回滚,因此事务内前面的代码也回滚了,整个事务没有执行。