事务

14 篇文章 0 订阅
14 篇文章 0 订阅

~1、事务的4个隔离性
ISOLATION_DEFAULT:用底层数据库的默认隔离级别,数据库管理员设置什么就是什么
ISOLATION_READ_UNCOMMITTED(未提交读-别人提交你读-脏读):最低隔离级别、事务未提交前,就可被其他事务读取
(会出现幻读、脏读、不可重复读)
ISOLATION_READ_COMMITTED(提交读-别人提交后你再读-读写不分离锁全表-不可重复度):一个事务提交后才能被其他事务读取到
(该隔离级别禁止其他事务读取到未提交事务的数据、所以还是会造成幻读、不可重复读)、sql server默认级别
ISOLATION_REPEATABLE_READ(可重复读-读写分离-幻读):可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致
,禁止读取到别的事务未提交的数据(该隔离基本可防止脏读,不可重复读(重点在修改),但会出现幻读(重点在增加与删除))(MySql默认级别,更改可通过set transaction isolation level 级别)
ISOLATION_SERIALIZABLE(序列化):代价最高最可靠的隔离级别(该隔离级别能防止脏读、不可重复读、幻读)
prv:改了之后还没提交就被人读走了,后来变成改的过程不让读,这样也不好就又改成改的过程可以读但是读的是提交过的东西,正在
提交的不加入结果。
丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于
没有加锁造成的;
幻读:同样的事务操作过程中,不同时间段多次(不同事务)读取同一数据,读取到的内容不一致(一般是行数变多或变少)。
脏读:一个事务读取到另外一个未提及事务的内容,即为脏读。
不可重复读:同一事务中,多次读取内容不一致(一般行数不变,而内容变了)。
幻读与不可重复读的区别:幻读的重点在于插入与删除,即第二次查询会发现比第一次查询数据变少或者变多了,以至于给人一种幻象一样,
而不可重复读重点在于修改,即第二次查询会发现查询结果比第一次查询结果不一致,即第一次结果已经不可重现了。
数据库隔离级别越高,执行代价越高,并发执行能力越差,因此在实际项目开发使用时要综合考虑,为了考虑并发性能一般使用提交读隔离
级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。
MySQL InnoDB的默认隔离级别是Repeatable read
行级锁:select 语句最后加 for update 有索引就用行级锁,没索引就锁整个表
MySQL InnoDB 默认行级锁,行级锁都是基于索引,SQL 语句用不到索引是不会使用行级锁的,而会使用表级锁把整张表锁住
行级锁都是基于索引的,如果一条 SQL 语句用不到索引是不会使用行级锁的,而会使用表级锁把整张表锁住,这点需要咱们格外的注意
当多个用户对同时访问和视图更改同一资源的时候,会发生冲突,此时对其进行加锁,可以避免读脏数据,for update 是行级锁定。
通常是批量或多表修改记录时,如果需要先校验记录之间的逻辑关系,为了保证校验之后数据不被其他会话更改(保证逻辑关系不会改变),那么应该在 select 语句中加 for update。
看到网站上有火车票,但是买的时候却买不到,这个时候就要加forupdate
脏读、不可重复读、幻读
~2、事务
转载链接:https://blog.csdn.net/hanxintong9/article/details/52448205
【Spring】——事务实现过程及原理
1、Spring中事务处理的作用:
Spring事务处理,是将事务处理的工作统一起来,并为事务处理提供通用的支持。
2、工作原理及实现
a、划分处理单元——IOC
由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring中的IOC划分了事务处理单元。并且将对事务的各种
配置放到了ioc容器中(设置事务管理器,设置事务的传播特性及隔离机制)。
b、AOP拦截需要进行事务处理的类
Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,事务对象的抽象),用
TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,
将事务处理的功能编织到拦截的方法中。读取ioc容器事务配置属性,转化为spring事务处理需要的内部数据结构(TransactionAttri
buteSourceAdvisor),转化为TransactionAttribute表示的数据对象。
c、对事物处理实现(事务的生成、提交、回滚、挂起)
spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持、hibernate数据源事务处
理支持、JDO数据源事务处理支持,JPA、JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager、AbstractPlat
forTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的TransactionManager。
d、结合
PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个
Spring声明式事务处理的设计体系。
3、应用场景
支持不同数据源,在底层进行封装,可以做到事务即开即用,这样的好处是:即使有其他的数据源事务处理需要,Spring也提供了一种一致的方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值