一、事务介绍
(1)事务是数据库操作最基本单元,逻辑上一组操作要么都成功要么都失败,如果有一个失败所有操作都失败
(2)为什么要使用事务--银行转账举例说明
(1) lucy 转账100元给mary
(2)lucy少100,mary多100
假如(1)已执行且出现异常,(2)还未执行,如果不使用事务,则会出现lucy的100元不见的问题
(3)where(在哪里使用)--事务可以作用于conroller层、service层、dao层,不过一般是放在sevice层
@Transactional可以用在类,也可以用在方法上:
用在方法上,表示该方法使用事务;
用在类上,表示类中的所有方法使用事务
(4)how(spring事务底层实现原理是什么)-->AOP
(5)how(spring如何实现事务)
Spring提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
(6)数据库提供的事务四个特性(ACID)
- 原子性:要么都成功,要么都失败,是一个原子。
- 一致性:事务是要求强一致性的。
- 隔离性:多事务之间操作同一数据(即并发操作同一数据),相互隔离互不影响。如果不考虑隔离性,会产生脏读、不可重复读、虚(幻)读这三个读问题。
- 持久性:事务提交以后,会持久化存在数据库中
ACID仅是数据库提供的事务特性,spring对事务属性进行了扩展,如增加了事务传播属性。传播属性是描述:同一线程中,事务嵌套时,事务如何管理
(7)spring事务需要的依赖jar(maven项目)
<!-- JdbcTemplate实现jar --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency> <!-- 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!-- 事务管理 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
二、环境搭建--纯注解方式
(1)配置类
package com.fuping3.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration //配置类
@ComponentScan(basePackages = {"com.fuping3"}) //组件扫描
@EnableTransactionManagement //开启事务
public class DaoConfig {
/**
* 创建带连接池的数据源
* @return
* @throws Exception
*/
@Bean
public DataSource dataSource() throws Exception {
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/fuping3?useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
/**
* 创建JdbcTemplate对象
* @param dataSource
* @return
*/
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
/**
* 创建事务管理器
* @param dataSource
* @return
*/
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
(2)service代码
@Service
@Transactional
public class BookService {
.
.
.
}
或
@Service
public class BookService {
.
.
.
@Transactional
public int addBook(Book book){
System.out.println("添加业务逻辑处理。。。");
int add= bookDao.addBook(book);
return add;
}
}
三、环境搭建--注解方式
(1)spring配置文件
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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">
<!--创建数据源(带druid连接池)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/fuping3?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--创建JdbcTemplate对象,给DAO层使用-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启注解式事务-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
(2)service层代码
同环境搭建--纯注解方式
四、环境搭建--xml方式
(1)spring配置文件核心代码
<!--1 创建事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--注入数据源--> <property name="dataSource" ref="dataSource"></property> </bean> <!--2 配置通知--> <tx:advice id="txadvice"> <!--配置事务参数--> <tx:attributes> <!--指定哪种规则的方法上面添加事务--> <tx:method name="accountMoney" propagation="REQUIRED"/> <!--<tx:method name="account*"/>--> </tx:attributes> </tx:advice> <!--3 配置切入点和切面--> <aop:config> <!--配置切入点--> <aop:pointcut id="pt" expression="execution(* com.fuping3.service.BookService.*(..))"/> <!--配置切面--> <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/> </aop:config>