事务的介绍与使用

事务

事务的隔离级别isolation

事务的传播机制propagation

业务方法A可能调用业务方法B,两个可能都加了事务注解,此时改以谁为准
REQUIRED: 支持当前事务(外部事务,即调用者A),如果不存在则创建新事务. A有事务就按A的来,没有则创建一个新事物
REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(B嵌套在A中执行,但B有独立的提交和回滚),否则就会REQUIRED一样.

声明式事务

@Transactional 注解

    @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("[email protected]");
        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";
    }

编程式事务

利用 TransactionTemplate 构造事务:

  1. 创建TransactionTemplate对象

  2. 给对象 设置隔离级别和传播机制

  3. 调用方法execute

    execute( … ) 传入的参数有两种选择:

    1)TransactionCallback 有返回值

    2)TransactionCallbackWithoutResult 无返回值

TransactionCallback 有返回值

public Object getObject(String str) {
    
    
        /*
         *  执行带有返回值<Object>的事务管理
         */
        transactionTemplate.execute(
            // 接口泛型与重写方法的返回值一致
            new TransactionCallback<Object>() {
    
    
            	@Override
            	public Object doInTransaction(TransactionStatus 	transactionStatus) {
    
    
                	try {
    
    
                    	//.......   业务代码
                    	return new Object();
                	} catch (Exception e) {
    
    
                    	//回滚
                    	transactionStatus.setRollbackOnly();
                    	return null;
                	}
            	}
        	});
}

TransactionCallbackWithoutResult 无返回值

public void update(String str) {
    
    
         /*
         *  执行无返回值的事务管理
         */
        transactionTemplate.execute(
            new TransactionCallbackWithoutResult() {
    
    
            	@Override
            	protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
    
    
                	try {
    
    
                    	// ....  业务代码
                	} catch (Exception e){
    
    
                    	//回滚
                    	transactionStatus.setRollbackOnly();
                	}
            	}
        	});
}

实例

    @Autowired
    private TransactionTemplate transactionTemplate;

    public Object save2() {
    
    
        // 设置隔离级别 和 传播机制
        transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 调用方法:execute(回调接口) 接口泛型与重写方法的返回值一致
        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("[email protected]");
                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";
            }
        });
    }

参考文章

https://blog.csdn.net/qq_39248747/article/details/126877113

一些选择题

3.14【瑞客论 坛 www.ruike1.com】

D

3.15【瑞客论 坛 www.ruike1.com】

A

3.16【瑞客论 坛 www.ruike1.com】

D

3.17【瑞客论 坛 www.ruike1.com】错误:B 改正:C

3.18【瑞客论 坛 www.ruike1.com】

D

D-1709223415726)]

D

[外链图片转存中…(img-HQQCLtnR-1709223415726)]错误:B 改正:C

[外链图片转存中…(img-bvwAPUHr-1709223415726)]

D

猜你喜欢

转载自blog.csdn.net/ShirleyZ1007/article/details/136384339