MySQL事务

事务是一组SQL语句组成的数据库逻辑处理单元.
这组语句不是全部执行成功,就是全部执行失败.

四大特性:
(1).原子性
指事务的原子性操作,不是全部成功就是全部失败. 基于日志的Redo/Undo机制.
(2).隔离性
指事务之间相互隔离,不受彼此影响
(3).持久性
指一个事务在提交以后,这个事务的状态会被持久化到数据库中.
(4).一致性
指执行事务前后的状态要一致.

Redo /Undo机制
作用:
将所有对数据的更新操作写到日志中; 并且可以在数据库执行过程崩的时候回滚之前已经执行成功的操作, 实现事务的一致性.

Redo Log:
记录某数据块被修改后的值,可以恢复未写入data file 的已成功事务更新的数据.

Undo Log:
记录数据更新前的值, 保证数据更新失败能够回滚.

举例:
事务A, B 在执行, A已提交而B未提交.
数据库重启进行crash-recovery时就可以通过Redo log将已提交事务的更改写到数据文件中, 未提交的通过Undo log进行事务回滚.

事务出现的问题
脏读
读到另一个事务的未提交数据产生.由读未提交产生.
将隔离级别设置为读提交(Read Committed)解决脏读

不可重复读
即一个事务在任意时刻读到的数据可能不一样, 主要由于update操作.
可重复读解决不可重复读和脏读, 但会产生幻读.
若有两个事务, 事务一已提交数据, 第二个事务UPDATE并提交后第一个事务SELECT的数据发生了变化.
比如将两个事务的全局变量设置为session, 将两个session开启为REPEATABLE READ(可重读), 同时开启事务. 第一个事务先SELECT, 第二个事务UPDATE. 此时会发现即使第二个事务已经commit, 第一个事务再次SELECT数据依旧无变化.

幻读(针对insert操作)
第一个事务查询数据x发现不存在, 此时进入第二个事务, 新增一条相同内容的数据x, 此时第一个事务select数据x发现已存在. 但此时第一个事务新增数据x会报主键冲突.
将隔离级别设置为可串行化(Serializable).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值