propagation_required,isolation_default
时间: 2023-05-03 20:01:21 浏览: 66
Q: 什么是'propagation_required,isolation_default'?
A: 'propagation_required,isolation_default'是与事务相关的两个单词。'propagation_required'表示当前方法需要在已经存在的事务中运行,如果没有已存在的事务则会新建一个;'isolation_default'表示默认的事务隔离级别,即其他事务在执行时无法读取当前方法的未提交数据。
相关问题
spring传播行为和隔离级别
Spring的传播行为分为以下7种:
1. PROPAGATION_REQUIRED:默认的传播行为,如果当前没有事务,则开启一个新的事务;如果已经存在事务,则加入该事务中。
2. PROPAGATION_SUPPORTS:如果当前存在事务,则使用该事务;如果不存在事务,则不使用事务。
3. PROPAGATION_MANDATORY:必须在当前事务中运行,否则就会抛出异常。
4. PROPAGATION_REQUIRES_NEW:每次都会开启一个新的事务,如果当前存在事务,则挂起该事务。
5. PROPAGATION_NOT_SUPPORTED:不支持事务,如果当前存在事务,则挂起该事务。
6. PROPAGATION_NEVER:不支持事务,如果当前存在事务,则抛出异常。
7. PROPAGATION_NESTED:在当前事务的基础上,开启一个子事务。
Spring的隔离级别分为以下4种:
1. ISOLATION_DEFAULT:由底层数据库默认隔离级别确定。一般来说,MySQL是REPEATABLE READ,Oracle是READ COMMITTED。
2. ISOLATION_READ_UNCOMMITTED:可以读取未提交的数据。
3. ISOLATION_READ_COMMITTED:读取已提交的数据,保证不会读到脏数据。
4. ISOLATION_REPEATABLE_READ:可以重复读取数据,保证可重复性。
5. ISOLATION_SERIALIZABLE:完全串行化,最高的隔离级别,保证所有事务串行执行,但可能出现严重的性能问题。
@Transactional 注解作用
@Transactional注解是Spring框架中用于管理事务的注解。它可以作用于接口、类、类方法,并且可以配置多个属性信息。当放在类上时,表示该类的所有public方法都使用相同的事务属性信息;当放在方法上时,表示该方法使用自己的事务属性信息,会覆盖类的事务配置信息。@Transactional注解的属性包括propagation、isolation、timeout、readOnly、rollbackFor、noRollbackFor等。其中,propagation属性用于指定事务的传播行为,isolation属性用于指定事务的隔离级别,timeout属性用于指定事务的超时时间,readOnly属性用于指定事务是否只读,rollbackFor属性用于指定哪些异常需要回滚事务,noRollbackFor属性用于指定哪些异常不需要回滚事务。
示例代码如下:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 36000, rollbackFor = Exception.class)
public void addUser(User user) {
userDao.addUser(user);
}
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 36000, rollbackFor = Exception.class)
public void updateUser(User user) {
userDao.updateUser(user);
}
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 36000, rollbackFor = Exception.class)
public void deleteUser(int userId) {
userDao.deleteUser(userId);
}
@Override
@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.DEFAULT, readOnly = true, timeout = 36000, rollbackFor = Exception.class)
public User getUserById(int userId) {
return userDao.getUserById(userId);
}
@Override
@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.DEFAULT, readOnly = true, timeout = 36000, rollbackFor = Exception.class)
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
}
```