spring项目步骤及事务归纳



第一步:下载对应的框架包
第二步:从框架包中选取需要的jar文件(如果有maven服务器,就不用选着jar文件,直接修改pom.xml去指定项目中需要的jar)
第三步:
1、创建项目
2、组织包结构
3、类结构(OOAD)
4、编写对应的配置文件(一般来说主要是spring框架的配置):
1、开启自动扫描机制,将项目纳入容器来管理
<context:component-scan base-package="com.lovo"></context:component-scan>
<context:property-placeholder location="classpath:mysql01.properties" ignore-
unresolvable="true"/>把数据库关联起来
component-scan:开启自动扫描机制;base-package="com.lovo":扫描的地方(包)
ignore-unresolvable="true":忽略不可识别的字符;
location="classpath:mysql01.properties":地址
2、配置数据源连接池(数据库)来源于:spring-jdbc.jar
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
如果url直接写在XML中,那么&符号就需要使用&amp;来表示,如果写在properties,就直接使用&符号即可
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
3、配置数据源所对应的sessionfactory,来源于:mybatis-spring.jar
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 如果存在多个包同时需要取类别名时,可以用,或者;间隔书写 -->
<property name="typeAliasesPackage"取别名用于区分包
value="com.lovo.personmag.studentmag.beans,
com.lovo.personmag.teachermag.beans,
com.lovo.personmag.usermag.beans"></property>
</bean>
4、配置sqlmapper的映射扫描,并将扫描后的文件与session进行关联;来源于:mybatis-spring.jar
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 如果存在多个包同时需要扫描映射文件的时候,可以用,或者;间隔书-->
<property name="basePackage"
value="com.lovo.personmag.studentmag.mapper,
com.lovo.personmag.teachermag.mapper,
com.lovo.personmag.usermag.mapper"></property>
<!-- 将上述的映射文件与SqlSession进行关联 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
不能用name="sqlSessionFactory",可能出现下面调用时还没有session对象,没有产生时间顺序
</bean>
5、配置事务管理器,来源于:spring-jdbc.jar-->
<bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
6、配置spring管理事务的方式(最重要的是springAOP:两次提交机制(第一次:预提交,第二次在所有都执行成功之后再提交,否则回滚))
事务:一组具有明确执行边界的执行过程
目的:用来确保操作数据的时候,数据的完整性和一致性
在web项目中通常为一个请求,因为一个请求就对应着一个执行过程
类型:逻辑事务、物理事务
逻辑事务:业务事务,保证业务逻辑的统一成功
物理事务:数据库业务、保证数据的准确性
事务的特性:ACID:
1、原子性:一个事务是一个密不可分的,要么都成功,要么都失败
2、一致性:事务一旦开启,处理事务的整个过程中,数据满足(质量守恒),入多少,出多少,也就是数据的准确性
3、隔离性:事务与事务之间(多个事务如果同时处理同一数据,是互不干扰的,相互之间没有任何影响,目的是为了防止数据被破坏
4、持久性:事务一旦提交,那么结果就应该具有持久性,不应该再吃被统一事务进行破坏,应该持久化到数据库中

事务的隔离:要求事务必须在他处理完之后,其他数据才能处理相同的数据,如果严格准寻事务的隔离性,虽然保证了数据的准确性,但是牺牲了项目的性能(等同于线程加锁)
这时就要在数据的准确性(空间)和项目的性能(空间)上做综合的权衡:时空转换,严格准寻隔离性,肯定不可取,得放松事务的隔离原则
隔离原则级别:
1、可串行化(serializable):是事务管理中隔离最高级别,绝对保证数据的准确性,其他的级别都会在一定程度上允许数据的不一致;他的实现原理接近于对数据加锁
2、可重复读(repeatable read):使用最为广泛的一种;仅次于可串行化,但是他会造成数据得幻读,给操作着造成不应该有的幻觉,所谓幻读也就是当前事务不是独立执行的时候发生的情况
(操作大量数据时)A--B(2000+1000)还未查询,C--B(-1000);A再查询,就会发现以为还没改,从而出现一定的问题
3、读已提交(read committed):会造成不可重复读,数据库访问中,同一个事务范围内两次查询结果不一致;AB操作同意数据,A操作了两次,B在两次中间更改了,所以两次查询出来的结果不一致;
4、读未提交(read uncummitted):(谁用谁完蛋)会造成脏读,事务在处理的时候,可以读到其他事务尚未提交的数据,来做开发;也叫做无效数据的读取,在系统中根据做出的操作时不准确的

总结:如何保证数据的准确性,和灵活性,需要综合权衡

事务的传播:当多个同时具有事务控制能力的service的实现类方法相互调用时,所形成的事务边界控制问题,在spring框架中常见的事务边界控制有如下几种:

1、requered(增加删除修改)
支持当前事务,如果当前没有事务,新建事务----最为常见(cud)
2、supports(查找)
支持当前事务,如果没有事务,就按照非事务方式执行,通常在查询的时候使用最多
3、mandatory
支持当前事务,如果没有事务就抛出异常
4、requered-new
无论有没有事务都新建一个事务,并且按照新事务来执行,老事务挂起
5、not-supports
以非事务方式执行,如果有事务,就将事务挂起,
6、never
绝对不能在事务范围内执行,如果有事务就将事务挂起,只有该方法没有关联到事务,才能正常执行
7、nested
如果调用者与被调用者都有事务,那么就将被调用者的事务包含到调用的事务当中,如果没有就跟1处理方式相同

如果URL直接写在xml中&要用&amp表示,如果在。。。不需要amp

在spring框架中,事务的处理方式,一般具有2种:
1、编程式事务,将事务控制的代码嵌入到业务逻辑的方法中去管理事务的提交与回滚,通常在编程式事务中,必须在每一个业务操作方法中都包含有额外的事务管理代码
<tx:annotation-driven transaction-manager="txManage"/>
2、声名式事务,再企业应用中,种种管理事务方式最为常见,将事务管理声名在配置文件中,交由容器采用AOP来动态管理面向切向的思想去处理业务层的事务,它将事务管理提到切面 中,也就是将事务管理从核心代码中分离出来,好处是,我们只需要关注客户所提供的核心业务
通知
作用于哪个管理器上
方法名/传播/隔离/什么时候回滚/只读
execution
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值