Spring框架(事务)

事务概念

1.什么是事务

(1)事务是数据库操作的最基本单元,逻辑上的一组操作,要么都成功,若果有一个失败所有操作都失败

(2)经典案例:银行转账

*lucy转账100元给mary

*lucy少100,mary多100

2.事物的四个特性(ACID)

(1)原子性

(2)一致性

(3)隔离性

(4)持久性

事务操作(搭建事务操作的环境)

1.创建数据库的表,添加记录

 

 

2.创建server,搭建dao,完成对象创建和注入关系

(1)server注入dao,在dao注入jdbcTemlate,在jdbcTemlate注入DataSource

//注入dao
@Autowired
private UserDao userDao;
@Autowired
private JdbcTemplate jdbcTemplate;
<!--jdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--    注入dataSource-->
    <property name="dataSource" ref="dataSource"></property>
</bean>

3.在dao创建两个方法,多钱和少钱的方法,在service创建转账的方法

//多钱
@Override
public void addMoney() {
    String sql = "update t_account set monet=money+? where username=?";
    jdbcTemplate.update(sql,100,"mary");
}
//少钱
​
/**
 * lucy转帐100给mary
 */
@Override
public void reduceMoney() {
    String sql = "update t_account set monet=money-? where username=?";
    jdbcTemplate.update(sql,100,"lucy");
}
//转账的方法
public void accountMoney(){
    //lucy少100
    userDao.reduceMoney();
    //mary多100
    userDao.addMoney();
}

4.上面代码,如果正常执行没有问题,但是如果代码执行过程中出现异常,有问题

//转账的方法
public void accountMoney(){
    //lucy少100
    userDao.reduceMoney();
    
    //模拟异常
    int i= 10/0;
​
​
    //mary多100
    userDao.addMoney();
}

(1)上面的问题如何解决

*使用事务进行解决

(2)事务操作过程

//转账的方法
public void accountMoney(){
    try{
        //1.开启事务
        
        //2.进行业务操作
        
        //lucy少100
        userDao.reduceMoney();
        //模拟异常
        int i= 10/0;
        //mary多100
        userDao.addMoney();
        //3.没有发生异常,提交事务
        
    }catch (Exception e){
        //4.出现异常,事务回滚
    }
​
}

事务操作(Spring事务管理操作)

1.事务添加到javaEE三层结构里面Service层(业务逻辑层)

2.在Spring进行事务管理操作

(1)有两种方式:编程式事务管理,声明式事务管理*(使用)

3.声明式事务管理

(1)基于注解方式(使用)

(2)基于xml配置文件方式

4.在Spring进行声明式事务管理,底层使用AOP原理

5.Spring事务管理API

(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

PlatformTransactionManager

事务操作(注解声明式事务管理)

1.在Spring配置文件中配置事务管理器

<!--    创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        注入数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

2.在Spring配置文件中,开启事务注解

(1)在Spring配置文件中引入名称空间

xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

(2)开启事务注解

<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3.在service类上面(或者service类里面的方法上面)添加事务注解

(1)@Transactional,这个注解可以添加到类上面,也可以添加到方法上面

(2)如果这个注解添加到方法上面,这个方法添加事务

@Service
@Transactional
public class UserService {
    
}

事务操作(声明式事务管理有一些参数的配置)

1.propagation 事物的传播行为

当一个事务的方法被另外一个事务的方法调用时,这个事物的方法如何进行:

 

2.ioslation:事务隔离级别

(1)事务有特性称为隔离性,多事务操作之间不会产生影响。不考虑隔离性会产生很多问题。

(2)有三个读问题:脏读,不可重复读,虚读。

(3)脏读:一个未提交的事务读取到了另一个未提交的事物

(4)不可重复读:一个未提交的事务读取到了另一个提交的事物修改的数据

(5)虚读:一个未提交的事务读取到了另一个提交的事物添加的数据

(6)解决:通过设置事物的隔离级别,解决读问题

Service
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
public class UserService {

3.timeout:超时时间

(1)事务需要在一定的时间内进行提交,如果不提交进行回滚

(2)默认值是-1,设置时间以秒单位

4.readOnly:是否只读

(1)读:查询操作,写:添加修改删除操作

(2)readOnly默认值是flase,表示可以查询,可以添加修改删除操作

(3)readOnly值是true,只能查询

5.rollbackFor:回滚

(1)设置出现哪些异常进行事务回滚

6.noRollbackFor:不回滚

(1)设置出现哪些异常不进行事务回滚

事务操作(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"/>
<!--            <tx:method name="account*"/>-->
        </tx:attributes>
    </tx:advice>

第三步:配置切入点和切面

<!--    3.配置切入点和切面-->
    <aop:config>
<!--        配置切入点-->
        <aop:pointcut id="pt" expression="execution(* com.spring.service.UserService.*(..))"/>
<!--        配置切面-->
        <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
    </aop:config>

事务操作(完全注解开发声明式事务管理)

1.创建配置类,使用配置类代替Spring配置文件中的注解配置

@Configuration//配置类
@ComponentScan(basePackages = "com.spring")//组件扫描
@EnableTransactionManagement//开启事务
public class txConfig {
​
​
    //创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/book_db?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
​
    }
    //jdbcTemplate对象
    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
        //到ioc容器中根据类型找到dataSource
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //注入dataSource
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
​
    // 创建事务管理器
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值