今天学了Spring中的JdbcTemplate应用和Spring中的事务管理机制
由于JdbcTemplate比较简单就不做赘述,在这里在下就记述一下Spring中的事务管理机制和一些鄙见。
事务这个词相信大家对其都并不陌生,有一定的数据库基础的朋友都应该听说过事物具备的四大特性:
- 原子性 Atomicity
- 一致性 Consistency
- 隔离性 Isolation
- 持久性 Durability
简称(ACID),但在并发场景下,如果不对事物做任何隔离或者保护措施,就可能会造脏读,幻读和不可重复读的异常,扰乱业务逻辑,对此我们的MySQL和Oracl的数据库都分别定制了一系列事务隔离机制来应对这些并发问题,当然安全的代价可能会带来低的效率,在人类还没想出更好的解决思路之前,我们先妥协一下前人给出的方案。
在JavaWeb开发中,我们可以用手动开启提交或者关闭connection来做到对事物的控制,我们学到了强大的IOC容器Spring, Spring也对事物操作做了很好的支持, 我们新建一个maven项目来做示范
注意读这篇文章的时候大家理应对Spring和JavaWeb开发有一定的小了解,如果之前从没接触过Spring的话,应该先去入门一下。
在开始之前我们先要导入一些项目中要用到的包
spring-context spring-jdbc spring-tx mysql-connector-java spring-test junit
首先引入事务管理概念,在Spring中大方向上有两种管理事务的模式,其一基于XML配置文件,另一种是基于注解,两者都各有特色,并不能盖棺定论孰优孰劣,但核心思想都是一致的,我们以XML配置文件为例,来对Spring事物先有一个纵览。
在XML文件中包扫描注解,引入properties文件还有配置数据库链接的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="*" read-only="false" propagation="REQUIRED"/>
<tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
前半段是配置Spring的事务管理器,传入参数DataSource就好
后半段是为这个事务管理器声明要管理的方法,并且注入事物的传播行为,隔离级别,超时时间等属性
那么声明好了事物以后我们怎么在项目中应用这些声明呢,高手过招总是无需多言,想必各位也早也想出了用Spring中自带的AOP切入方法,比话少说,上代码,
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.itheima.spring.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>
<aop/>标签第一句:切入点配置,定位横切逻辑织入的方法
<aop/>标签第二句:对于事务来说,不需要指定具体的方位信息(方法前/后等)aop:advisor将增强逻辑和切入点关联到一起(织入)
至此,我们就已经基本完成了事务控制的基本配置。
也就是说所有的方法都会开启事务,并且以query开头的方法是只读属性。。。
好了,剩下的基于注解的开发方法师出同源,等待各位自己去开发,我先去睡觉了。
总结一下
Spring事物控制,它的作用是解决了开发者对于管理事物的难以下手问题,提供了统一的操作空间并对事物属性进行高度的自定义。笔者给Spring中面向切面动态代理的术语做了一个私下的自定义------“项目内方法云劫持”
晚安