spring事务

spring事务管理接口:

platformTransactionManager:事务管理器

TransactionDefinition:事务定义信息(事务属性):隔离级别,传播行为,回滚规则,是否只读,事务超时

TransactionStatus:事务运行状态

1.事务定义:

逻辑上的一组操作,要么都执行要么都不执行。

2.事务特性:

ACID

原子性Atomic:事务的最小执行单位。确保动作要么完全执行,要么不执行

一致性Consistency:事务执行前后保持数据一致。

隔离性Isolation:并发访问数据库时,一个用户的事务不被其他事物干扰,各并发事务之间数据库是独立的。

持久性Durability:一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库出现故障也不应该对其有任何影响

如何理解ACID?

1.原子性:一个事务是不可分割的单元,在这个事务中,需要全部被执行成功,有一个执行异常就全部失败。个人理解原子性,强调不可分割的单元,回滚操作来保证原子性。

问题:怎样保证原子性?

mysql日志:InnoDB存储引擎还提供了两种事务日志:redo log(重做日志)和undo log(回滚日志)。其中redo log用于保证事务持久性;undo log则是事务原子性和隔离性实现的基础

undo log (回滚日志):记录的是sql执行相关的信息,逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

2.一致性:事务执行前后保持数据一致?理解为从一个正确的状态迁移到另一个正确的状态。

正确的状态为满足预定的约束,事务开启--------(当前状态)【张三账户有1000元,李四账户有1000元】---【张三给李四转账1100元】----- (新状态)【张三变成-100,李四变成2100】---事务提交

约束条件:1.数据表约束余额列不能< 0 2.余额列没有约束,业务上约束余额不能<0 3.没有任何约束

余额列不能< 0 ,在转账的时候通过事务回滚保证数据一致性

业务约束 通过事务回滚保证数据一致性

3.隔离性:并发下,各个事务之间的影响程度。并发访问下可能带来的问题有:

脏读:指一个事务正在访问并对数据进行了修改未提交,另一个事务也读取使用了这条数据,这个事务获取到的还是未提交的数据,获取到的是一个“脏数据”,依据脏数据做的操作是不正确的。

例如:一个用户开通了两笔会员,事务A在做开通(更新会员标识,设置服务开始结束时间假如是:2019-11-06~2020-11-06)的同时,事务B也对该会员进行开通,A在未提交的时候,B获取到A未提交已经开通的数据(获取到了服务开始结束时间2019-11-06~2020-11-06),当A发生了回滚(A服务时间为空),B在A的基础上开通续费(获取到了服务开始结束时间2019-11-06~2020-11-06,计算续费时长得到新结果2019-11-06~2021-11-06),当A修正后再开通,在B的基础上开通,服务时间就为2019-11-06~2022-11-06.

不可重复读:A事务在两次/多次读取,B事务修改了数据导致A在读取存在不一样的结果

例如:事务A读取到的工资为2000,事务B修改了工资为3000,当事务A再读取时发现工资为3000,两次数据不一致

幻读:A事务在读取过程中,B事务新增或删除了数据,导致A读取到了不一样的结果。

例如:A读取到的工资大于3000的有4个人,B事务录入了4个工资大于3000,A再次读取时发现有8个。

隔离级别:为解决并发带来的问题,通过设置隔离级别来解决这些问题,具体分为以下几种:

隔离级别

脏读(Dirty Read)

不可重复读(NonRepeatable Read)

幻读(Phantom Read)

未提交读(Read uncommitted)

可能

可能

可能

已提交读(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不可能

不可能

不可能

Read Uncommitted:读未提交,允许读取未提交的数据,可能出现脏读,幻读,不可重复读(隔离级别最低)

Read Committed:读已提交(oracle默认设置),允许读取并发事务已提交的数据,可阻止脏读,幻读和不可重复读有可能发生

Repeatable Read:可重复读(mysql默认设置),对同一数据的多次读取结果是一致的,除非本事务修改,可阻止脏读/不可重复读,幻读可能发生

Serilization:序列化,事务隔离级别最高,所有事务逐个进行,事务之间完全不受干扰。可防止脏读、不可重复读、幻读。(影响性能,通常不会使用)

问题:事务隔离怎样实现的?

事务隔离一般通过加锁方式实现,探索innodb的事务隔离级别和锁关系

read committed:(解决脏读,脏读是B读取到了A修改(增,删,改)的内容)读不加任何锁,insert,update,delete需要加锁

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值