事务的核心概念就是:要么都成功,要么都失败。
ACID原则:
原子性 一致性 隔离性 持久性
spring中的事务:
声明式事务 AOP
编程式事务:通过代码手动去管理 不推荐。
在spring配置文件插入代码
<!--结合AOP 实现事务的织入-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--设置那些方法开启事务-->
<!--设置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>
<!--切入点-->
<aop:pointcut id="txPointcut" expression="execution(* mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
写一个add和delete方法 这里故意写错delete查询语句
<insert id="addUser" parameterType="User">
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<delete id="deleteUser" parameterType="int">
deletessss from mybatis.user where id=#{id}
</delete>
在一个方法里同时运行这些方法
package mapper;
import org.mybatis.spring.SqlSessionTemplate;
import pojo.User;
import java.util.List;
public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate sqlSession;
//现在我们的所有操作都由SqlSessionTemplate操作
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user=new User(8,"小王","123456");
mapper.addUser(user);
//此时出错
mapper.deleteUser(8);
return mapper.selectUser();
}
public int addUser(User user) {
return sqlSession.getMapper(UserMapper.class).addUser(user);
}
public int deleteUser(int id) {
return sqlSession.getMapper(UserMapper.class).deleteUser(id);
}
}
运行程序会报错,同时会发现因为delete错误导致其他操作也并没有执行
符合事务的特性
原文:https://www.cnblogs.com/OfflineBoy/p/14688578.html