1.在Mysql中,只有當表的類型是INNODB的時候,才支持事務,因此須要把表的類型設置爲INNODB,不然沒法觀察到事務.
修改表的類型爲INNODB的SQL:java
alter table hero ENGINE = innodb;
查看錶的類型的SQLmysql
show table status from tablename;web
2.spring
applicationContext.xmlsql
<!-- 開啓事務註解,標註@Transactional的類和方法將具備事務性 --> <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" /> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
<!--spring的配置文件application.xml中包掃描不須要掃描@Controller註解的, 具體以下:--> <context:component-scan base-package="com.crossoverJie"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan>
3.SpringMVC.xmlexpress
<!--springMVC配置文件springMVC-servlet.xml中只須要掃描@Controller註解的,具體以下:--> <context:component-scan base-package="com.crossoverJie"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> <!--下面這個是防止事務沒起做用,spring.xml的父容器先於Servlet的子容器生效,將Service提早加載了。這裏不用再進行加載裝配--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>
4.testapp
在方法上加上註解:ide
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) @Override public void addTwo() { addOne(); Category c1 = new Category(); c1.setName("短的名字"); categoryMapper.add(c1); } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) @Override public void addOne() { Category c2 = new Category(); c2.setName("名字長對應字段放不下"); categoryMapper.add(c2); int i = 9 / 0; //這裏會拋出異常 }
執行並查看日誌:日誌
java.lang.NullPointerException //異常信息component
DEBUG [main] (AbstractPlatformTransactionManager.java:847) - Initiating transaction rollback //回滾 DEBUG [main] (DataSourceTransactionManager.java:284) - Rolling back JDBC transaction on Connection [com.mysql.jdbc.JDBC4Connection@6ea2bc93] DEBUG [main] (DataSourceTransactionManager.java:327) - Releasing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6ea2bc93] after transaction DEBUG [main] (DataSourceUtils.java:327) - Returning JDBC Connection to DataSource //返回鏈接到鏈接池 說明事務生效了,遇到異常回滾。