事务管理实例体验:
A-B转账:A减去100元,将这100元加到B账户上,这里需要两条update语句,如果在两条update语句出现了一些错误,那么对于先执行的A来说是不公平的。所以就有了事务ACID特性
事务ACID特性:
一、原子性:
事务开始不会停留在中间,要么恢复到之前未执行事务的状态,要么在执行完事务的状态。
二、一致性:
数据库是有一个正确的状态到另一个正确的状态,不应该出现不符合常理和业务的状态。
三、隔离性:
两个相同的事务或者多个事务并发操作数据库时,应该隔离每一个事务间的影响。
四、持久性:
事务完成后,对于数据库的改变应该是永久的。
事务管理(注解方式):
在applicationContext-Service.xml中,添加
<!-- 事务管理器(这个不管哪种方法这个都要配置)-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 配置数据库源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注解方式事务管理-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
在XML中配置后,我们需要在业务层(Service)添加我们的@Transactional注解,来让spring替我们进行事务管理。
@Transactional
public void insertUser(User user) {
// 调用Dao的插入方法
userDao.insertUser(user);
int i=1/0; //添加一个必然会错的语句
userDao.insertUser(user);
}
必然会报错除数不能等于0的错误,但是我们发现这个方法中除于0的语句之前的语句也不会执行成功,这便是事务管理。
事务管理(XML方式):
<!--XML配置-->
<tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<!-- 传播行为 -->
<!--REQUIRED 行为,如果业务中已经有在使用的事务,那么就不会新建事务了,没有得话就会创建新的事务-->
<tx:method name="insert*" propagation="REQUIRED" />
<!--SUPPORTS有事务用事务,没有的话会以非事务类型运行,read-only 代表不会对数据库进行改变-->
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<!-- 使用Execution表达式需要添加aspectjweaver包。* com.ronghao.Service.*.*(..) 代表匹配Service包下的所有任意参数的任意方法-->
<aop:pointcut id="txpointcut" expression="execution(* com.ronghao.Service.*.*(..))" />
<aop:advisor pointcut-ref="txpointcut" advice-ref="txAdvice" />
</aop:config>
两种方法的区别:
当业务方法少的时候使用注解的方法简单方便,一般情况下都不会很少,所以都会用xml方式配置
我已经上传项目到我的资源上了
SSM简单整合
**
有遇到问题可以私信,24小时内必回
**