Java项目中使用事务

事务的四大特性

事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.
  • 一致性是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,它们的账户总和还是1000。
  • 隔离性。跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。
  • 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

事务隔离级别有哪些?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需求:注册一个用户,系统自动为他发一个帖子“新人报道”

在这里插入图片描述

声明式事务

在Java中,声明式事务是通过注解或XML配置的方式来实现的,主要用于管理方法或类的事务处理。Spring框架是Java中最常用的实现声明式事务的工具之一。以下是声明式事务在Java中的一般实现方式:

使用Spring框架:Spring框架提供了声明式事务管理的支持。通过在方法上添加@Transactional注解,可以将方法声明为一个事务性方法。Spring会在运行时基于这些注解来管理事务的开启、提交、回滚等操作。

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyRepository repository;

    @Transactional
    public void myTransactionalMethod() {
        // 执行数据库操作
        repository.save(entity);

		//主动加错看事务是否回滚,因为事务保证原子性,有错误会把上面的操作也撤回
    	Integer.valueOf("abc");    }
}

编程式事务

使用Spring的TransactionTemplate是在Java中实现编程式事务的一种便捷方式。它封装了事务管理的细节,简化了事务处理的代码,同时提供了更加灵活的事务控制。

  • transactionTemplate.setIsolationLevel:设置隔离级别

  • transactionTemplate.setPropagationBehavior:设置传播级别

  • 调用方法 execute匿名实现接口TransactionCallback,回调方法

public Object save2() {
//创建TransactionTemplate对象
    transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    
	//使用TransactionTemplate执行事务
    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";
        }
    });
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值