3.13 事务管理

添加评论 要用到事务管理方面内容
在这里插入图片描述
在这里插入图片描述
接下来详解 第一类丢失更新
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面试的时候,这几种异常都要讲清楚。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在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);
    }

}

还是报刚刚的错误 ,且均未添加成果

意味着其成功回滚,

意味着管理事务是没有问题的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值