spring事物

 

两个不同的事物是独立的

注意事物的顺序 :例如一个事物是查询一个事物是插入 先执行插入后查询两个事物,

就发生了脏读的可能,

脏读: 一个事物没有提交就被其他事物读取到了 解决方法 提高事物隔离级别 (Read_committed)

不可重复读: 同一个事物中 同一个sql语句查询出来的结果不一样 例如:执行完第一次查询后 执行了insert或者update ,再次执行第一次查询的sql后 两次结果不一致(两个事物是独立的 一个事物两次查询,中间发生了一个插入或者修改的事物,两次查询不同)提高到可重复读(mysql默认是可重复读,oracle和sql server 是以提交读 read committed)

有些时候发现你吧隔离级别提到了REPEATABLE_READ后还是发生了不可重复读,

可能是本来一个查询的事物变成了两个(变成了两个查询事物一个插入事物) 进行select查询会自动提交事物

 

幻读: 场景--> 注册的时候判断手机号码是否重复,基本的操作是先查询有没有这个号码,没有的话进行插入. 受网络问题,点了第一次注册信息没有反应,然后瞬间多点了很多次,问题就来了 导致了并发的事物  绿色的线代表查询  红丝的代表着插入 并发的事物的时候,两个事物一起去查,发现没有 ,两个事物同时执行了插入,导致插入两次

 

 

可串行化 : 就没有并发的操作了 全部排队 不可取

解决办法 : 加锁,对程序的操作

 

not_supported 不支持当前事物, 当前存在事物 ,会自己在创建事物往下走

method-A 调用了method-B 方法 那么method-B的当前事物就是method-A中的事物

 

传播机制 就是method-A怎么把事物传给method-B

 

案例: 分别往user和account表中插入数据 插入顺序是 先调用createUser插入user 然后在调用AddAccount方法插入account 并且AddAccount方法插入有个除零异常

 

在两个方法中分别加上或不加上或使用不同事物事物 看情况如何

 

默认的事物如果加上了这个注解 :如果没有事物就创建,如果有就使用当前事物

@Transactional(propagation = Propagation.REQUIRED)

 

事物:  同一个事物描述: 新建连接和commit中间的操作

新建连接

   conn = new Connection

   conn.setAutoCommit(false) //自动提交关闭

//curd

conn.commit()  or   conn.rollback()   or conn.close()

 

下面的图 1 代表成功插入数据,  2 代表失败插入数据

 

场景3 : 事物的默认传播方式,公用一个事物,当addAccount发生异常时,这个整个事物失败,都不提交

场景4: not_supported 不支持当前事物, 当前存在事物 ,会事物挂起

底层是用aop的操作 实现共享连接

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值