事务的四大特性
事务特性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";
}
});
}