Spring事务管理
Spring提供了强大的事务管理服务,可以方便的实现事务控制,避免了在代码中写大量的底层JDBC事务代码。本篇文章将详细说明Spring事务的隔离级别、传播机制以及简单配置方式。
事务隔离级别
事务隔离级别是数据库保证数据一致性的重要手段,在并发访问数据库时可以防止不同线程对同一个数据产生相互影响的问题。Spring框架支持设置五个事务隔离级别:
DEFAULT
:使用后端数据库的默认隔离级别,MySQL默认为REPEATABLE-READ。READ_UNCOMMITTED
:允许脏读、幻读、不可重复读。READ_COMMITTED
:禁止脏读,但允许幻读、不可重复读。REPEATABLE_READ
:禁止脏读、幻读,但允许不可重复读。SERIALIZABLE
:禁止脏读、幻读、不可重复读。
事务传播机制
Spring定义了7种事务传播机制,在进行嵌套式事务的管理时,这些传播机制扮演了很重要的角色。Spring的7种事务传播机制分别是:
PROPAGATION_REQUIRED
:默认传播机制,当前方法必须在事务中运行,如果没有事务,则开启一个新事务。PROPAGATION_SUPPORTS
:当前方法支持事务,如果当前存在事务,就在该事务中运行,否则就不在事务中运行。PROPAGATION_MANDATORY
:当前方法必须运行在一个事务中,如果当前没有事务,抛出异常。PROPAGATION_REQUIRES_NEW
:新建一个事务并运行,如果当前存在事务,则挂起当前事务再新建一个事务。PROPAGATION_NOT_SUPPORTED
:当前方法不支持事务,如果当前存在事务,就将当前事务挂起。PROPAGATION_NEVER
:当前方法必须在没有事务的环境中运行,否则将抛出异常。PROPAGATION_NESTED
:当前方法必须运行在一个事务内,如果存在一个支持事务的上下文中运行,则使用嵌套事务。
简单配置方式示例
下面的代码对应的是spring 5.x版本,采用了注解方式,配置了一个简单的事务管理器。
@Configuration
@EnableTransactionManagement
public class TransactionalConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:db/sql/create-db.sql")
.addScript("classpath:db/sql/insert-data.sql")
.build();
}
@Bean(name="transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
其中EmbeddedDatabaseBuilder
用于创建内存型数据库实例,执行指定的sql语句。DataSourceTransactionManager
是Spring框架内置的事务管理器,用于统一管理数据源中的事务,执行事务提交、回滚等操作,具体代码如下:
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void updateUser(User user){
userDao.updateUser(user);
}
}
其中@Transactional
注解用于标注开启事务,并设置事务的传播机制和隔离级别。可以看到,使用简单的注解方式就完成了事务的配置,大大简化了代码的编写。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring事务隔离级别、传播机制以及简单配置方式 - Python技术站