-
数据库中的事务可以保证在连续执行的 多条写操作(增删改)
时,这多条操作要么成功,要么全部失败,以保证数据和逻辑的完整及严谨
-
在使用
mybatis
时,无需考虑事务如何创建,如何提交等,只需要配置好事务管理器
配置事务管理器(DataSourceTransactionManager)
<!-- 加载db.properties -->
<util:propertiesid="dbConfig"
location="classpath:db.properties" />
<!-- 配置数据源 -->
<beanid="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="url"
value="#{dbConfig.url}" />
<propertyname="driverClassName"
value="#{dbConfig.driver}" />
<propertyname="username"
value="#{dbConfig.user}" />
<propertyname="password"
value="#{dbConfig.password}" />
<propertyname="initialSize"
value="#{dbConfig.initSize}" />
<propertyname="maxActive"
value="#{dbConfig.maxSize}" />
</bean>
<!-- 配置MapperScannerConfigurer,自动扫描整个包,并且spring会自动创建UserMapper接口对象-->
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件所在的包 -->
<propertyname="basePackage"
value="cn.tedu.spring.mapper" />
</bean>
<!-- 配置SqlSessionFactoryBean -->
<beanclass="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源:如何连接数据库等 -->
<propertyname="dataSource"
ref="dataSource" />
<!-- 配置XML文件的位置 -->
<propertyname="mapperLocations"
value="classpath:mappers/UserMapper.xml" />
</bean>
<!--配置事务管理器,需要用到前面配置的数据源datasource-->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource"ref="dataSource"></property>
</bean>
开启事务注解
<!-- 开启事务注解 ,transaction-manager指定的是上面配置的事务管理器的id-->
<tx:annotation-driventransaction-manager="transactionManager"/>
在需要使用事务的方法上添加 @Transactional
注解(或者是Service类上)
- 如果添加在类上,那么类中的全部方法都会被事务管理器管理
- 如果添加在方法上,那么只有这个方法会被管理
-
事务只发生在
service
的
@Transactional
public void ChangePasssword(Integer id, String oldPassword,
String newPassword) throws UserNotFoundException, PasswordNotMatchException{
User user=this.findUserById(id); //获取用户信息
if (user==null) { //如果用户信息不存在
throw new UserNotFoundException("操作失败,用户信息不存在");
}else { //用户存在,则判断原密码
if (user.getPassword().equals(oldPassword)) {//如果密码匹配
User user1=new User();
user1.setPassword(newPassword);
userMapper.update(user1);
}else { //原密码不匹配
throw new PasswordNotMatchException("操作失败,原密码不正确");
}
}
}
-
在
service
类上添加 @Transactional
注解,那么类中的整个方法都会被管理
@Service
@Transactional //配置事务管理
public class UserServiceImplimplements IUserService{
@Resource
private UserMapper userMapper;
}
开启组件扫描
-
在
spring-service.xml
中开启组件扫描 service
即可
<!-- 组件扫描 -->
<context:component-scanbase-package="cn.tedu.spring.service"/>
事务如何处理
-
在spring处理事务时,如果遇到
RuntimeException
就会自动回滚
完整的spring配置文件
<!-- 加载db.properties -->
<util:propertiesid="dbConfig"
location="classpath:db.properties" />
<!-- 数据源 -->
<beanid="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="url"
value="#{dbConfig.url}" />
<propertyname="driverClassName"
value="#{dbConfig.driver}" />
<propertyname="username"
value="#{dbConfig.user}" />
<propertyname="password"
value="#{dbConfig.password}" />
<propertyname="initialSize"
value="#{dbConfig.initSize}" />
<propertyname="maxActive"
value="#{dbConfig.maxSize}" />
</bean>
<!-- 配置MapperScannerConfigurer,自动扫描整个包,并且spring会自动创建UserMapper接口对象-->
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件所在的包 -->
<propertyname="basePackage"
value="cn.tedu.spring.mapper" />
</bean>
<!-- 配置SqlSessionFactoryBean -->
<beanclass="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源:如何连接数据库等 -->
<propertyname="dataSource"
ref="dataSource" />
<!-- 配置XML文件的位置,其中的值是一个数组 -->
<propertyname="mapperLocations">
<array>
<value>classpath:mappers/UserMapper.xml</value>
<value>classpath:mappers/DormitoryMapper.xml</value>
</array>
</property>
</bean>
<!-- 配置事务管理器 -->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 配置数据源 -->
<propertyname="dataSource"ref="dataSource"></property>
</bean>
<!-- 开启事务注解 ,transaction-manager指定的是上面配置的事务管理器的id-->
<tx:annotation-driventransaction-manager="transactionManager"/>
原文
https://chenjiabing666.github.io/2018/05/04/Mybatis配置事务管理器/