Spring 事务的简单使用
2018-03-10 15:08
411 查看
最近一直在思考spring中事务的机制。然后经过一系列的资料搜索和阅读,得知spring中对事务只是提供了对数据库层面的事务。而对其它的如内存中的对象等并没有实现回滚等机制。
简单介绍下使用mybatis时的spring事务的使用:
Spring中关于事务的核心配置如下:
spring-config-dao.mxl简要配置如下:
<!--首先配置数据源,这里就不粘贴详细配置了。-->
<bean id="learnDataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
<!--然后配置sqlSession mapper sqlSessionFactory 等-->
<!--事务 开启-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="learnDataSource"></property>
</bean>
<!--事务 结束-->spring-config.mxl简要配置如下:<import resource="classpath:spring/spring-config-dao.xml"/>
<!--开启aop织入-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 开启事务控制的注解支持 声明式事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置transactionTemplate 编程式事务 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
<!--定义事务隔离级别,-1表示使用数据库默认级别-->
<property name="readOnly" value="false"></property>
<property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
</bean>依次配置好dao,mapper等对应的orm框架所需要的东西。
我们新建一个Transaction类。将其声明为service交于spring托管。如下:
新建测试类:代码如下:@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-config.xml")
public class DefTest {
private Logger logger = LoggerFactory.getLogger(DefTest.class);
@Resource
Transaction transaction;
@Test
public void test() {
验证了只对数据库层面进行了回滚。
值得注意的是,虽然数据库没有插入数据,但是经历一次回滚后,主键自增的id就被占用了一个。说明数据库中已经存在了这条数据,因为回滚的原因被删除了。我想这可能跟数据库隔离级别有关。
简单介绍下使用mybatis时的spring事务的使用:
Spring中关于事务的核心配置如下:
spring-config-dao.mxl简要配置如下:
<!--首先配置数据源,这里就不粘贴详细配置了。-->
<bean id="learnDataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
<!--然后配置sqlSession mapper sqlSessionFactory 等-->
<!--事务 开启-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="learnDataSource"></property>
</bean>
<!--事务 结束-->spring-config.mxl简要配置如下:<import resource="classpath:spring/spring-config-dao.xml"/>
<!--开启aop织入-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 开启事务控制的注解支持 声明式事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置transactionTemplate 编程式事务 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
<!--定义事务隔离级别,-1表示使用数据库默认级别-->
<property name="readOnly" value="false"></property>
<property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
</bean>依次配置好dao,mapper等对应的orm框架所需要的东西。
我们新建一个Transaction类。将其声明为service交于spring托管。如下:
@Service public class Transaction { @Resource private UserDao userDao; @Resource private TransactionTemplate transactionTemplate; public List<User> listUser(){ return userDao.selectUser(); } /** * 声明式事务 * @param user */ @Transactional public void transactionAnnotationTest(User user){ user.setPsw("------"); userDao.insertUser(user); int i = 1/0; //引发异常 } /** * 编程式事务 */ public void transactionProgramTransaction(final User user){ Object execute = transactionTemplate.execute(new TransactionCallback<Object>() { public Integer doInTransaction(TransactionStatus transactionStatus) { try { user.setPsw("------"); userDao.insertUser(user); int i = 1 / 0;//引发异常 return null; }catch (Exception e){ transactionStatus.setRollbackOnly(); } return null; } }); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { user.setPsw("------"); userDao.insertUser(user); int i = 1/0;//引发异常 } }); } }
新建测试类:代码如下:@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-config.xml")
public class DefTest {
private Logger logger = LoggerFactory.getLogger(DefTest.class);
@Resource
Transaction transaction;
@Test
public void test() {
User user = new User(); String flag = "06"; user.setName("TestName" + flag); user.setAddress("TestAddress" + flag); user.setTelephone("170102861"+flag); List<User> users = transaction.listUser(); for(User u:users){ logger.info("u: {}",u); } try { transaction.transactionProgramTransaction(user); }catch (Exception e){ logger.error("transactionTest has error",e); } logger.info("user.psw: {}",user.getPsw()); users = transaction.listUser(); logger.info("-----------"); for(User u:users){ logger.info("u: {}",u); }}}运行结果可以显示 两次打印结果相同,但是user对象的psw被修改。
验证了只对数据库层面进行了回滚。
值得注意的是,虽然数据库没有插入数据,但是经历一次回滚后,主键自增的id就被占用了一个。说明数据库中已经存在了这条数据,因为回滚的原因被删除了。我想这可能跟数据库隔离级别有关。
相关文章推荐
- Spring Data Jpa 简单使用事务
- Spring中TransactionTemplate 简单灵活的事务配置及使用
- 使用SpringMVC+mybatis+事务控制+JSON 配置最简单WEB
- Spring Data Jpa 简单使用事务
- Spring中TransactionTemplate 简单灵活的事务配置及使用
- 使用buffalo集成spring写的一个简单的登录子模块
- Spring--简单使用quartz实现定时作业
- 使用Ado.Net进行简单事务处理的四种实现及比较
- 使用Spring来创建一个简单的工作流引擎
- Spring中配合hibernate使用的简单例子
- 使用AOP,在spring中实现简单的性能测试
- 使用Spring 2.0 新特性实现声明式事务管理-基于XML Schema
- 使用Spring 2.0 新特性实现声明式事务管理-基于Annotation
- 使用Spring AOP 自动代理配置声明式事务
- Spring声明式事务之MathAlwaysTransactionAtttirbuteSource使用
- 使用Spring来创建一个简单的工作流引擎
- Spring使用Quartz配置调度事务
- 使用Spring来创建一个简单的工作流引擎
- 使用Spring来创建一个简单的工作流引擎
- 在spring中使用声明型事务