spring事务是不是数据库事务的实验

在数据库中使用事务需要在存储过程中用begin end之类的语法,来保证在这个存储过程中执行的sql可以回滚。

在spring里可以使用DataSourceTransactionManager事务管理器对操作数据库的代码进行管理,从而做到不使用存储过程也能达到回滚的效果。

实验记录

application-context配置(部分)

<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:component-scan base-package="org.example.dao"/>
<context:component-scan base-package="org.example.service"/>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />

<!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethod"
expression=" execution(* org.zhangc.service..*(..))" />
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>

代码(部分)
dao类:
public void insertTest(){

String strSqlinsert1="insert t1 values('aaa');";
String strSqlinsert2="insert t11 values('aaa');";
jdbcTemplate.update(strSqlinsert2);
jdbcTemplate.update(strSqlinsert1);
}

service类:
@Autowired
private Dao dao;

public void insertTestService(){

dao.insertTest();

}

Test类:
@Test
public void TestSql(){
String strSqlinsert1="insert t1 values('aaa');";
String strSqlinsert2="insert t11 values('aaa');";
jdbcTemplate.update(strSqlinsert2);
jdbcTemplate.update(strSqlinsert1);
}

@Test
public void TestService(){
testData.insertTestService();

}
 
表:
create table t1(name varchar(20))
create table t11(name varchar(20))

执行过程:
一、正常插入
保持数据库正常,执行TestSql方法与TestService方法,都可以在两张正常插入记录。
二、修改t1表名为t12.
执行TestSql方法,会报错,但t11表记录仍然插入。(这个就是没有事务的原因,t1表插入执行不成功不影响t11插入执行。)
执行TestService方法,会报错。两张表都没有插入。实际是t11表回滚了操作。



 

posted on 2022-05-15 11:22  在思考中坚持  阅读(56)  评论(0)    收藏  举报

导航