1.注入依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.事务的详细说明
2.1什么是事务
通俗来讲就是一些事情的只能同时完成,获取同时不完成,比如银行转账功能,自己账户往别人账户赚钱,自己钱减少,别人钱增加,这两件事必须同时成功和失败。
2.2事务的四个属性ACID
1、原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用
2、一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中
3、隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
4、持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中
2. 3事务隔离级别和事务并发
并发问题:
脏读(dirty read):一个事务读到了另一个未提交的事务
不可重复读(non-repeatable read):一个事务中两次读同一行数据,可是这两次读到的数据不一样
.幻读(phantom read):一个事务中两次查询,但第二次查询比第一次查询多了或少了几行或几列数据
事务隔离级别有4种:
1 - read-uncommitted
2 - read-committed
4 - repeatable read
8- serializable
一般使用第二种,即数据库的隔离级别。
3.声明式事务管理
1.加入事务管理,jdbcTemplate和aop的约束,本次案例使用了注解注入,所以添加了
xmlns:context="http://www.springframework.org/schema/context"
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--注解和aop需要的配置-->
<context:component-scan base-package="com.spring"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
2.注入jdbcTemplate和数据源。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="liuqing.1998"></property>
</bean>
3.1配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3.2配置事务的通知
<tx:advice id="txAdvice" transaction-manager="transactionManager">
</tx:advice>
3.3配置aop表达式和事务的关系
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.spring.service.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
3.4配置事务的属性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--指定方法名:第一种通配,任意方法。第二种find方法才会执行
属性的详细配置参考上图。
-->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
4.测试
本案例使用了spring的test测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:bean.xml")
public class springtest {
@Autowired
private AccountService as;
@Test
public void test(){
as.transfer("bbb","aaa",100);
}
}