Spring事务处理

Spring事务处理

Mysql事务处理
  1. mysql中的事务

    事务的四大特性:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability),也称作(acid)

    Mysql中只有Innodb数据库引擎才支持事务,Mysql默认以自动提交的方式运行。

  2. 事物的并发问题

    • 脏读

在这里插入图片描述

即某个事务中读取了在数据库缓存中的数据,解决方法:就是不允许事务去访问其他事务的缓存,只能去访问公共数据。

  • 不可重复读

在这里插入图片描述
即:当同一个事务,在读取同一个表中同一行数据的某一个属性时,两次读取的数值不一样,解决办法:可以设置一个行级锁,当一个事务在读取某一个行时,不允许其他事务对该行进行操作。

  • 幻读

在这里插入图片描述

即:当某个事务查询整张表时,发现多出来的信息,注意区别于不可重复读,幻读产生主要是因为插入导致而不可重复读由于修改导致,解决办法:设置一个表级锁,当一个事务在操作一张表时,锁住该表,不允许其他事务对该表进行操作。

  1. 事务的隔离级别

在这里插入图片描述

jdbc事务处理
  1. Jdbc的执行流程:1.加载驱动,2.创建连接,3.创建语句,4.执行语句;在这个过程中,一个连接即可以封装成一个事务

范例代码,如下:

	try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, userName, password);
            connection.setAutoCommit(false);
            Statement statement = connection.createStatement();
            statement.execute("insert into orders values('100002', '100004', 2, 2499, now(), null, null, '程明杨', '13576768787', '西安', '代发货')");
            statement.execute("update products set stock = stock - 2 where id = '100004'");
            statement.close();
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
Spring事务处理
  1. spring事务处理中最主要的几个接口

在这里插入图片描述

PlatformTransactionManager 用于生成一个事务,同时传入一个TransactionDefinition参数,用于表示,生成一个什么样的事务,创建出来的事务就是TransactionStatus类型,即可以认为:TransactionDefinition表示定义一个什么样的事务,TransactionStatus表示创建好的正在运行的事务。 PlatfromTransactionManager同时拥有一些实现类,如:DateSourceTransactionManager:若持久层使用 jdbcTemplate、mybaties等等则选择该管理器;HibernateTransactionManager: 若持久层使用的是Hibernate,则使用该管理器; JpaTransactionManager: 若持久层用的是jpa模式,则使用该管理器;

spring中的事务一般用在业务层,即Service层,因为只有在这一层,才会将一些列持久层的操作封装起来进行操作。

  1. 什么是事务的传播行为:(为了解决业务层方法之间的互相调用的事务问题)

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

public class Propagation {
    // 当有两个方法,一个a方法,一个b方法,若两个方法都属于各自的事务中,当a事务中调用了b方法,
    // 同时b方法也属于一个事务,那么这时候就要看事务的传播行为,来决定了,具体如下:
    // PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务就新建一个事务。这个最常用
    // 意思是:如下面的例子,如果a方法是一个事务,且a事务中调用了b方法,那么b方法就会加入a事务当中,
    // 如果当前a方法中没有事务,那么b自己会创建一个事务,自己就是一个事务
    // 同理还有很多其他的事务传播行为,就不一一列举
    public void a() {
        // begin
        // 步骤
        b();
        // commit
    }

    public void b() {
        // begin
        // 步骤
        // commit
    }
}
spring事务处理机制有哪几种方式

1.编程式事务处理

  • 基于底层API的方法
  • 基于TransactionTemplate方式

2.声明式事务处理

  • 基于TransactionInterceptor的方式
  • 基于TransactionProxyFacotoryBean的方式
  • 基于<tx>命名空间的方式
  • 基于@Transactional注解的方式

其中5,6两种方式是推荐的,也是被经常使用的。详细可以见项目中如何使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值