事物的ACID原则:
-
原子性
-
一致性
-
隔离性
-
持久性
事物:
-
把一组业务当成一个业务,要么都成功,要么都失败
-
涉及数据一致性问题
-
确保完整性和一致性
spring中的事务管理分为:
-
声明式事物:AOP
-
编程式事物:需要在代码中,进行事物的管理
今天主要学习声明式事物:
在spring配置文件中配置生命是事物:
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/aop/tx/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
<!--配置声明式事物-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<!--集合AOP实现事物的编入-->
<!--配合事物通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给哪些方法配置失误-->
<!--p配置事务的传播特性 propagation(传播) REQUIRED(默认选择)-->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事物切入-->
<aop:config>
<!--mapper下的所有方法-->
<aop:pointcut id="txPointCut" expression="execution(* com.ding.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
其他相关文件:
applicationContext,xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<import resource="spring-dao.xml"/>
<!--bean-->
<bean id="userMapper" class="com.ding.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心 配置文件-->
<configuration>
<!--每一个mapper.xml都需要在mybatis核心配置文件中注册-->
<typeAliases>
<package name="com.ding.pojo"/>
</typeAliases>
<!-- 设置一般不整合 -->
<!--<settings>
<setting name="" value=""/>
</settings>-->
</configuration>
UserMapper:
public interface UserMapper {
public List<User> getUser();
public int addUser(User user);
public int deleteUser(int id);
}
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--核心 配置文件-->
<mapper namespace="com.ding.mapper.UserMapper">
<select id="selectUser" resultType="com.ding.pojo.User">
select * from user
</select>
<insert id="addUser" parameterType="com.ding.pojo.User">
insert into user(id,name,pwd) values (#{id},#{name},#{pwd)
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
</mapper>
UserMapperImpl:
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
@Override
public List<User> getUser() {
User user = new User(10,"dzl","123456");
UserMapper mapper1 = getSqlSession().getMapper(UserMapper.class);
mapper1.addUser(user);
deleteUser(10);
//在查询用户之前创建并删除一个用户
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.getUser();
}
@Override
public int addUser(User user) {
return getSqlSession().getMapper(UserMapper.class).addUser(user);
}
@Override
public int deleteUser(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
}