所谓事务指的是一种用来保护数据完整性的机制 ,事务为与数据相关的操作定义了一个边界 ,并将他们组合在一起,以便这些操作的最终结果不会使底层数据处于不一致状态
ACID(原子性,一致性,隔离性,持久性)表示可靠的事务管理系统应该如何运行才能够在不牺牲性能要求的情况下,跨多个并发用户操作,保护数据完整性,以下是ACID 的属性介绍
下面是spring 对事务的支持
spring 支持声明式事务,使用注解来选择需要使用事务的方法,当然,也可以对类使用注解,当类和方法同时使用事务注解时,类级别的注解会重载方法级别的注解 spring的事务,主要是基于AOP 的实现操作。在使用了声明式事务的注解的方法被调用时,spring会开启一个新的事务,当方法无异常运行结束后,spring会提交这个事务,否则回滚
spring中实现事务的具体步骤如下(由spring boot 实现)
@SpringBootApplication
@EnableTransactionManagement
public class SpingbootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpingbootmybatisApplication.class, args);
}
}
自定义事务行为
对于事务管理,事务行为是需要了解的,下面是一些自定义事务行为
在事务划分期间,可以使用Transactional 注解提供的一组默认属性,当然可以根据需要来更改默认的事务行为(在Transactional 添加对应的属性即可)
propagation 定义了事务范围,是否跨越多个方法调用等,主要有以下几种选择(默认值为REQUIRED )
REQUIRD 方法A 新建一个事务,当方法A调用方法B 的时候,方法B 也将使用相同的事务,如果方法B 发生异常需要回滚,则整个事务数据回滚
REQUIRES_NEW 对于方法AB ,在调用方法时每个方法都开启一个事务,如果方法B 有异常,则只回滚对应方法的事务
NESTED 与REQUIRES_NEW 类似 。但是没有两个独立的事务,只有一个跨不同方法调用的活动事务 ,通过保存点来标记新的方法的调用,当在第二个方法发生异常时,在最后一个保存点之前的事务都将回滚
isolation 指定了底层数据库的隔离级别 (默认为DEFAULLT)
timeout 指定事务超时时间。默认为当前数据库的事务超时时间,可以直接将其传递给底层数据库
readOnly 指定当前事务是否只读事务 默认为false
rollbackFor 指定某个,或者某些异常可以引起事务回滚,
noRollbackFor 指定某些异常不可以引起事务回滚
//方法级别的事务
@Transactional(rollbackFor = Exception.class)
@Override
public void insertUser(User user) {
userMapper.insertSelective(user);
}
//类级别的事务
@Transactional(rollbackFor = Exception.class)
public class UserImpl implements IUser {
}
事务的级别:
类级别的事务 :在类级别使用Transactional ,如果在类级别使用注解,那么类中的所有的公共方法都被事务
方法级别的事务: 在方法上使用Transactional 。需要注意的是 ,如果一个类中,同时存在类级别和方法级别事务 方法级别的Transactional 注解会重写在类级别使用的事务行为
demo 代码:srping boot 实现事务管理