spring事务是不是数据库事务的实验(Is spring transaction an experiment of database transaction)

在数据库中使用事务需要在存储过程中用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类:
@Autowiredprivate Dao dao;public void insertTestService(){    dao.insertTest();}Test类:
@Testpublic void TestSql(){  String strSqlinsert1="insert t1 values('aaa');";    String strSqlinsert2="insert t11 values('aaa');";    jdbcTemplate.update(strSqlinsert2);    jdbcTemplate.update(strSqlinsert1);}@Testpublic 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表回滚了操作。
————————

Using transactions in the database requires syntax such as begin end in the stored procedure to ensure that the SQL executed in the stored procedure can be rolled back.

In spring, you can use the data source transaction manager transaction manager to manage the code of operating the database, so that you can achieve the effect of rollback without using stored procedures.

Experimental record

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类:
@Autowiredprivate Dao dao;public void insertTestService(){    dao.insertTest();}Test类:
@Testpublic void TestSql(){  String strSqlinsert1="insert t1 values('aaa');";    String strSqlinsert2="insert t11 values('aaa');";    jdbcTemplate.update(strSqlinsert2);    jdbcTemplate.update(strSqlinsert1);}@Testpublic 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表回滚了操作。