Spring-事务

1.xml文件配置:

<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>

<bean id="log" class="com.user.demo.service.Log.Commos"></bean>

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

<!-- 创建数据源(数据库连接池使用dbcp) -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>

<property name="url" value="jdbc:mysql://localhost:3306/1506b?characterEncoding=UTF-8"></property>

<property name="username" value="root"></property>

<property name="password" value="root"></property>

</bean>

<!--配置声明式事务-->

<!--1.配置事务管理器,来定义一个我们要管理的事务-->

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

<!--配置事务通知,也就是配置那些方法需要配置事务,配置事务的传播特性-->

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<!--*代表所有方法,propagation="REQUIRED"代表配置该方法的事务传播特性,REQUIRED代表每次调用这个方法的时候都要检查该方法是否开启事务,如果开启了事务就使用已经开启的事务,没有开启则需要开启一个新事务,-->

<tx:method name="*" propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

<!--配置AOP的横切点和连接点-->

<aop:config>

<aop:pointcut id="user" expression="execution(* com.user.demo.service.Log.*.*(..))"></aop:pointcut>

<aop:advisor advice-ref="txAdvice" pointcut-ref="user"></aop:advisor>

</aop:config>

spring事务的传播特性:

1.propagation_required:在执行方法的时候检查是否开启事务,如果事务已经开启,则使用当前事务,如果没 有开启,则会开启一个新事务

2.propagetion_supports:在执行方法的时候检查是否开启事务,如果事务已经开启,则使用当前事务,如果没 有开启,则会作为非事 务方式执行

3.propagation_mandatory:在执行方法的时候检查是否开启事务,如果事务已经开启,则使用当前事务,如果没 有开启,则会抛出异常

4.propagation_required_new:每次在执行方法的时候都开启一个新的事务

5.propagation_not_supported:方法以非事务的方式执行,如果当前开启了事务,则会把当前事务挂起

6.propagation_never:方法以非事务的方式执行,如果当前存在事务,则抛出异常

7.propagation_nested:如果当前已经开启事务,则会在嵌套事务内执行,如果没有开启事务,则执行propagation_required类似的操作

8.spring中默认的事务传播方式是propagation_required

spring中引起事务并发的三种情况:

1.脏读(Dirty Reads):当一个事务来更新操作一条数据后,还没有进行提交,而这是另一个事务也来操作这条数据,并且读到了第一个事务为提交的数据,如果第一个事务操作失败进行了回滚,而第二个事务却读到了错误的数据

2.Non Repeatable Reads不可重复读:当一个事务多次对一条数据进行读取,另一个事务也对这一条数据进行读取,在前一个事务两次读取这条数据之间,后一个事务对这条数据进行了修改,这时候第一个事务两次读取到不同的数据,就会造成不可重复读

3.Phantom幻想读:当一个事务查询符合某一条件的数据,第一次查询出一条符合条件的数据,这是第二个事务又插入一条符合条件的数据,这时前一个数据再次查询符合条件的数据时查询出两条数据,仿佛就像幻觉一样,就是幻想读

spring事务的五种隔离级别:

1.DEFAULT(默认):他是默认的事务隔离级别,使用数据库默认的事务隔离级别,另外4个隔离级别与JDBC的隔离级别相对应

2.READ_UNCOMMITTED(读未提交):这是最低的事务隔离级别,他允许另一个事务可以看到另一个事务未提交的数据,这种事务隔离级别可能造成脏读,不可重复读和幻像读

3.READ_COMMITTED(读已提交):保证一个事务修改一条数据提交后另一个事务才能读取,一个事务不能读取另一个事务未提交的数据,这种事务隔离级别可以避免脏读,但可能出现不可重复读和幻象读

3.REPEATABLE_READ(可重复读):保证了一个事务不能读取另一个事务未提交的数据,也保证了不可重复读,这种事务隔离级别可以避免脏读和不可重复读,但可能会出现幻象读

4.SERIALIZABLE(串行化):这种是花费最高,但却是最可高的事务隔离级别,除了避免了脏读,不可重复读,也避免了幻象读

spring中事务传播行为的注解实现方式:

@Transactional(propagation=Propagation.REQUIRED)

如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

@Transactional(propagation=Propagation.NOT_SUPPORTED)

容器不为这个方法开启事务

@Transactional(propagation=Propagation.REQUIRES_NEW)

不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.MANDATORY)

必须在一个已有的事务中执行,否则抛出异常

@Transactional(propagation=Propagation.NEVER)

必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS)

如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

spring中设置事务超时时间

@Transactional(timeout=30) //默认是30秒

spring中使用注解实现事务隔离级别

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

读取未提交数据(会出现脏读, 不可重复读) 基本不使用

@Transactional(isolation = Isolation.READ_COMMITTED)

读取已提交数据(会出现不可重复读和幻读)

@Transactional(isolation = Isolation.REPEATABLE_READ)

可重复读(会出现幻读)

@Transactional(isolation = Isolation.SERIALIZABLE)

串行化

MySql中默认的事务隔离级别是:REPEATABLE_READ(可重复读)

SqlServer中默认的事务隔离级别是:READ_COMMITTED(读已提交)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值