您的位置:首页 > 编程语言 > Java开发

mybatis与spring整合事务管理

2016-03-03 21:16 519 查看
1.最重要的spring配置文件

<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${driverClassName}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
<property name="username">
<value>${username}</value>
</property>
<property name="url">
<value>${url}</value>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis.xml" />
<property name="plugins">
<array>
<ref bean="pagePlugin" />
</array>
</property>
<property name="mapperLocations">
<list>
<!-- 事务配置 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<aop:config>
<aop:pointcut
expression="execution(public * com.test.service.*.*(..))"
id="pointcutExtend" />
<aop:pointcut
expression="execution(public * com.test.frame.service.impl.*.*(..))"
id="pointcutBase" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutExtend" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutBase" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="query*" propagation="REQUIRED" read-only="true" />
<tx:method name="expand*" propagation="REQUIRED" read-only="true" />
<tx:method name="save*" propagation="REQUIRED"  rollback-for="Exception"/>
<tx:method name="insert*" propagation="REQUIRED"  rollback-for="Exception" />
<tx:method name="delete*" propagation="REQUIRED"  rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED"  rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
service中方法:

public String insertEntity(BaseEntity entity) throws Exception {
if (null == entity.getId() || "".equalsIgnoreCase(entity.getId())) {
entity.setId(CreateUuid.getID());
}
this.dao.insertEntity(entity);
int i=1/0;//测试spring事务
return entity.getId();
}


注意事项:

//1.直接<aop:pointcut

/*expression="execution(public * com.test.service.*.*(..))"

id="pointcut" />

达不到事务的目的,必须

<aop:pointcut

expression="execution(public * com.ssm.core.frame.service.impl.*.*(..))"

id="pointcut1" />

才可以,如果在子类ProviderServiceImpl中的方法可以使用上面第一句话来进行事务控制。一遍情况下子类为空,用的都是继承的BaseService中方法,只切面子类ProviderServiceImpl是不行的。

*/

测试代码:

Provider provider4 = new Provider();
//ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2
//provider4.setId(CreateUuid.getID());
provider4.setBh("bh4");
provider4.setMc("mc4");
provider4.setLxr("lxr4");
provider4.setDh("dh4");
provider4.setDz("dz4");
provider4.setYx("yx4");
provider4.setCz("cz4");
provider4.setBz1("bz1");
provider4.setBz2("bz2");
String insertResult4 = providerService.insertEntity(provider4);


正确输出日志为:

DEBUG 2016-03-03 21:11:47,004 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession
DEBUG 2016-03-03 21:11:47,009 org.mybatis.spring.SqlSessionUtils.main Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,047 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@112da40] will be managed by Spring
DEBUG 2016-03-03 21:11:47,048 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@112da40]
DEBUG 2016-03-03 21:11:47,053 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?)
DEBUG 2016-03-03 21:11:47,073 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: 832dd0a5747345dabdaeef72c184966e(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
DEBUG 2016-03-03 21:11:47,074 org.mybatis.spring.SqlSessionUtils.main Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Initiating transaction rollback
DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Rolling back JDBC transaction on Connection [org.sqlite.Conn@112da40]
DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization rolling back SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Releasing JDBC Connection [org.sqlite.Conn@112da40] after transaction
DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.ssm.core.frame.service.impl.BaseService.insertEntity(BaseService.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy8.insertEntity(Unknown Source)


注意日志中的有关事务的描述。

假如事务没起作用,比如pointcut指向的类不对,那么日志信息为:

DEBUG 2016-03-03 21:13:57,732 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession
DEBUG 2016-03-03 21:13:57,738 org.mybatis.spring.SqlSessionUtils.main SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945] was not registered for synchronization because synchronization is not active
DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DataSourceUtils.main Fetching JDBC Connection from DataSource
DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DriverManagerDataSource.main Creating new JDBC DriverManager Connection to [jdbc:sqlite:data/ikakeibo.dat]
DEBUG 2016-03-03 21:13:57,777 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@ecb67f] will not be managed by Spring
DEBUG 2016-03-03 21:13:57,778 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@ecb67f]
DEBUG 2016-03-03 21:13:57,783 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?)
DEBUG 2016-03-03 21:13:57,802 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: dcb3fe804163407fa3f45d0337595d2f(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
DEBUG 2016-03-03 21:13:57,911 org.mybatis.spring.SqlSessionUtils.main Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945]
DEBUG 2016-03-03 21:13:57,912 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource
Exception in thread "main" java.lang.ArithmeticException: / by zero


注意日志信息中的Closing non transactional SqlSession ,表明这个是没有事务控制的,因此可以成功插入记录,而没有进行回滚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: