Spring事务

一、前置条件:

1、Jdbc
2、Spring ioc Spring aop
3、Mysql

二、事务的概念:

事务一般指的是数据库事务,指的是一个程序执行单元测试的一系列的操作(指的就是数据库中的增删改查操作),要么完全执行,要么完全不执行;

三、事务的特性:

原子性:一个事务是不可分割的工作单位;

一致性:事务必须是使得数据库从一个一致性状态变到另一个一致性状态;

隔离性:一个事务执行不能被其他事务干扰; 上锁;

持久性:一个事务一旦提交,他对数据库的改变就是永久的;

四、事务简析:

1、Mysql事务

基本规则:

(1)innodb :支持事务;
(2)默认显示的是自动提交 aotocommit
  想要手动需要去改变事务,操作顺序如下:
  1)Begin 开启一个事务;
  2)Commit 提交事务,并使已对数据库所有修改变为永久;
  3)Rollback 回滚事务,并撤销正在进行的的所有未提交的修改,已提交则无法回滚;

Mysql事务并发问题:

例: 事务A   事务B
(1)脏读   解决方案:session 将回话独立
A、B同时购买一个产品(并发),B购买所有库存,库存变更为0;A读取到库存0,B退货库存回滚;但对
于A而言,读取到的库存为0,此为脏读。

(2)不可重复读  解决方案:将事务A正在读取的数据进行锁定,其他用户不能进行操作。
A、B同时购买一个产品(并发),A查看操作,读取到库存为100,紧接着B直接进行了购买所有库存,commit提交库存变更为0,此时A读取的库存瞬间变为0--重复读取会导致数据不准确。

(3)幻读 (解决上有本质区别)  解决方案:将整个商品表锁定
A、B同时购买产品(并发),A为客户在客户界面将店铺内所有产品全部购买,commit提交所有库存变更为0;B为商家,在商家界面新添加一个产品库存为100个,commit提交;对于客户A而言会产生误解,我已将所有库存购买,为何还有库存。

事务隔离级别:       是否解决问题

Spring事务

查看隔离级别:

Select @@tx_isolation 查看默认隔离级别的
Set session transaction isolation level xxx 设置隔离级别
Spring事务

2、jdbc事务处理

(1)Connection接口
   1)jdbc事务处理基于Connection接口的,jdbc通过Connection对象进行事务管理
   2)Jdbc默认是自动提交;

(2)事务相关方法:
   1)setAutoCommit设置自动提交 true 改为false手动修改,默认操作了begin
   2)Commit
   3)Rollback

(3)Jdbc事务隔离级别:
   1)Transaction-read-uncommitted
   2)Transaction-read-committed
   3)Transaction-repeatable-read
   4)Transaction-serializable

(4)常用隔离级别相关代码
   获取当前隔离级别 getTransactionIsolation
   设置当前隔离级别 setTransactionIsolation
Spring事务

3、Spring事务的处理

API 接口

TransationDefinition接口:
ISOLATION-read-uncommitted
ISOLATION-read-committed
ISOLATION-repeatable-read MYSQL
ISOLATION-serializable

默认超时
Timeout_default(默认30秒)

Spring事务传播行为;

Propagation-requided 必须事务 是默认的也是最常用的事务
针对必须事务,2种情况:
第一种情况:
Spring事务

第二种:
Spring事务

Spring事务处理–两大类的处理方式:

(1)编程式 代码行为 --基于底层API

1)
Spring事务
2)TransactionTemplate 简化事务编程的代码;
Spring事务

(2)声明式(建议)

Spring事务

Spring事务

Spring事务的处理:

(1)基于拦截器的事务方式

transactionInterceptor

(2)基于transactionProxyFactoryBean
(3)基于tx命名空间的

Spring事务

(4)基于@Transactional 注解方式

Spring事务