一、前置条件:
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而言会产生误解,我已将所有库存购买,为何还有库存。
事务隔离级别: 是否解决问题
查看隔离级别:
Select @@tx_isolation 查看默认隔离级别的
Set session transaction isolation level xxx 设置隔离级别
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
3、Spring事务的处理
API 接口
TransationDefinition接口:
ISOLATION-read-uncommitted
ISOLATION-read-committed
ISOLATION-repeatable-read MYSQL
ISOLATION-serializable
默认超时
Timeout_default(默认30秒)
Spring事务传播行为;
Propagation-requided 必须事务 是默认的也是最常用的事务
针对必须事务,2种情况:
第一种情况:
第二种:
Spring事务处理–两大类的处理方式:
(1)编程式 代码行为 --基于底层API
1)
2)TransactionTemplate 简化事务编程的代码;
(2)声明式(建议)
Spring事务的处理:
(1)基于拦截器的事务方式
transactionInterceptor