spring事務是不是資料庫事務的實驗
阿新 • • 發佈:2022-05-15
在資料庫中使用事務需要在儲存過程中用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表回滾了操作。