Spring整合mybatis事务,事务怎么都不提交.我要疯了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合mybatis事务,事务怎么都不提交.我要疯了相关的知识,希望对你有一定的参考价值。
参考技术A 这种问题,你应该先贴出自己项目中事务处理的xml配置,不然别人也无从下手。 这是我现在用的,没错,这种问题我一般都可以解决。因为我一般都在后盾人看一看相关的名师录制视频,效果还是不错的Spring的事务配置+mybatis整合
Spring的声明式事务和mybatis
Spring事务
首先事务(Transaction)是面向关系型数据库(RDBMS)企业应用程序的重要组成部分,用来确保数据的完整性和一致性。
事务具有以下 4 个特性,即原子性(要么都做要么都不做)、一致性(一致性状态转移)、隔离性(一个事务不受干扰,互不打扰)和持久性(事务提交之后对数据库修改是永久性的),这 4 个属性称为 ACID 特性。
spring对事务的管理有两种方式,一种基于编程式事务管理,通过编写代码实现事务管理。另一种基于AOP技术实现声明式事务。
编程式事务管理是通过编写代码实现的事务管理,灵活性高,但难以维护。
Spring 声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。
PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 是事务的 3 个核心接口。
重点介绍声明式事务:
1.基于XML方式声明式事务管理
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="$jdbc.driverClassName"/>
<property name="url" value="$jdbc.url"/>
<property name="password" value="$jdbc.password"/>
<property name="username" value="$jdbc.name"/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="upd*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="ins*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:aspect id="aspect" ref="proxy">
<aop:pointcut id="point" expression="execution(* com.xiaoliu.pojo.jdbctemplate.*.*(..))"/>
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
<aop:around method="around" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
<bean class="com.xiaoliu.pojo.jdbctemplate.UserDao1" id="userDao1"/>
<bean class="com.xiaoliu.pojo.jdbctemplate.UserProxy" id="proxy"/>
测试:
public void test02()
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config-04.xml");
UserDao1 user = applicationContext.getBean("userDao1",UserDao1.class);
JdbcTemplate jdbcTemplate = applicationContext.getBean(JdbcTemplate.class);
user.insert(jdbcTemplate);
在 Spring 中,声明式事务除了可以使用 XML 实现外,还可以使用 Annotation 注解。使用注解实现可以减少代码之间的耦合度。<tx:annotation-driven transaction-manager="txManager"/>
在需要使用事务的业务类或者方法中添加注解 @Transactional,并配置 @Transactional 的参数。
propagation:设置事务的传播行为;
isolation:设置事务的隔离级别;
readOnly:设置是读写事务还是只读事务;
timeout:事务超时事件(单位:s)。
Isolation 属性用于设置事务的隔离级别:
DEFAULT 默认
READ_UNCOMMITED 读未提交, 可以出现 (脏读 不可重复读 幻度)
READ_COMMITED 读已提交 防止脏读,(不可重复读 幻读)
REPEATABLE_READ 可重复读 防止 脏读和不可重复读 (可能会出现幻读)
SERIALIZABLE 串行话 防止脏读 幻读 不可重复度
事务的传播行为
REQUIRED 默认值
如果当前有事务,就在事务中执行,如果当前没有事务,就新建一个事务
SUPPORTS
如果当前有事务 在事务中执行,如果当前没有事务,就在非事务状态下执行
MANDATORY
必须在事务内执行,如果当前有事务就在事务中执行,如果当前没有事务,则报错
Requires_new
必须在事务中执行,如果当前没有事务,要新建事务,如果当前有事务,则把当前事务挂起
NOT_Supported
必须在非事务下执行,如果当前没有事务就正常执行,如果当前有事务,将事务挂起
NEVER
必须在非事务状态下指向性,如果当前没有事务 则正常执行,如果有事务—报错
NESTED
必须在事务状态下执行,如果哦没有事务就新建事务,如果当前有事务,则创建一个嵌套事务。
spring整合mybatis
配置文件:
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="$jdbc.driverClassName"/>
<property name="url" value="$jdbc.url"/>
<property name="password" value="$jdbc.password"/>
<property name="username" value="$jdbc.name"/>
</bean>
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean name="userMapperPlus" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.xiaoliu.mapper.UserMapperPlus"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
mapper接口
public interface UserMapperPlus
List<User> selectAll();
User selectByUsername(String username);
int insertUser(User record);
int deleteByPrimaryKey(String id);
int updateByPrimaryKey(User user);
mapper.xml
<select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
select
*
from user
where username = #username,jdbcType=VARCHAR
</select>
以上是关于Spring整合mybatis事务,事务怎么都不提交.我要疯了的主要内容,如果未能解决你的问题,请参考以下文章
spring和mybatis整合怎么将事务在service层关闭?使用xml配置