4.Mysql事务

事务

1定义

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

2定义事务
START TRANSACTION / BEGIN ; --开启事务
	Sql语句
COMMIT;	-- 提交事务
ROLLBACK; -- 回滚事务

注意:事务产生异常不会自动回滚,只能手动执行ROLLBACK回滚事务。

3事务的四个特性
  1. 原子性:事务中的各个操作要么一起成功,要么一起失败。
  2. 隔离性:事务没有执行完,其他程序不允许操作。
  3. 一致性:根据数据库原则,保证数据执行的数量是一致的
  4. 永久性:数据是永久保存在磁盘中的。
4事务执行流程

数据写入流程
重做日志:redo log => data/ib_logfile0
重新执行:事务在执行提交后,mysql停机,但是数据还没写入到磁盘中,Mysql重启后会重做日志,写入磁盘数据。

重写日志:undo log => data/ibdata
回滚数据:
1.手动执行回滚操作时会执行
2.程序在开启事务后,开始提交事务之前发生异常,在下次开启mysql时会执行

5事务生命周期

事务生命周期

6.事务的隔离级别

并行:

  1. 未授权读取(RU)<0>:也叫未提交读读取 => Read Uncommitted
    主要在于用作事务回滚和重做 - 共享锁 允许其他事务可以读取到正在修改的数据(事务进行中),但不允许修改
    解决的问题:没有使用事务时候数据不一致的问题,就是做到所执行的sql一起成功,一起回滚
    产生的问题:可以读取到其他事务所执行的sql结果 => 脏读
  2. 授权读取(RC)<1>:已提交读取 => Read Committed
    使用排他锁,不允许其他事务读取到数据,也不允许修改,但是别的事务时排他锁就能读取到数据。
    解决的问题:解决脏读
    产生的问题:可以读取到其他事务已提交的数据,不可重复读
  3. 可重复读(RR)<2>:Repeatable Read
    使用排他锁,会把读取到的数据放入缓冲区,而且会给其他事务加一把锁,其他食物就读取不到数据(会产生幻读)
    解决的问题:解决脏读,不可重复读
    产生的问题:幻读

单线程:

  1. 序列化 <3> :Serializable
    问题最小,会把多线程变成单线程,并发能力低,安全性最高(不仅通过锁,还有其他机制)
    解决的问题:解决脏读,不可重复读、幻读
    产生的问题:效率低

从上到下隔离级别依次增加

性能从上到下依次降低,安全性从上到下增高

Mysql 默认隔离级别:可重复读取(RR)

7.事务与IO

生命周期

innodb_flush_log_at_trx_commit(影响的是事务执行了commit提交之后数据的写入问题以及日志刷新问题<影响的是日志刷新问题>)主要是redo文件在这里插入图片描述

8.事务的使用与建议

  1. .控制事务的大小(操作写的数据)
  2. 使用锁的时候尽量配合携带索引字段使用,避免升级为表锁
  3. 范围查询,尽量减少基于范围查询的事务大小; =>间隙锁
  4. 如果业务必须要使用锁,锁的冲突特别高 => 改为表锁
  5. 可以根据项目情况调节事务的 innodb_flush_log_at_trx_commit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值