mybatis与spring整合事务管理
2016-03-03 21:16
519 查看
1.最重要的spring配置文件
注意事项:
//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是不行的。
*/
测试代码:
正确输出日志为:
注意日志中的有关事务的描述。
假如事务没起作用,比如pointcut指向的类不对,那么日志信息为:
注意日志信息中的Closing non transactional SqlSession ,表明这个是没有事务控制的,因此可以成功插入记录,而没有进行回滚。
<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 ,表明这个是没有事务控制的,因此可以成功插入记录,而没有进行回滚。
相关文章推荐
- Java关键字——instanceof
- Spring文档学习--缓存(Cache Abstraction)
- [think in java]知识点学习
- webmagic的设计机制及原理-如何开发一个Java爬虫
- Java杭电2072
- java笔记1
- java DES加密解密
- Java集合框架
- 【JAVA知识】IO流
- JDK1.7的新特性
- java.io 类分层结构 (Java 2 Platform SE 6)
- 手把手教你搭建SpringMVC——最小化配置
- Eclipse下Add Native Support报错:“Unable to launch cygpath”解决方案
- Java垃圾回收机制
- Java的方法重载
- Spring配置文件<context:property-placeholder>标签使用漫谈
- spring 中属性scope 的prototype(有状态)和singleton(无状态)
- eclipse如何快速查找某个类
- 了解Java的反射,使用Java的反射!
- ConcurrentHashMap之实现细节