欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4.Mysql事务

程序员文章站 2022-05-09 15:59:09
...

事务

1定义

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

2定义事务

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

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

3事务的四个特性

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

4事务执行流程

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

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

5事务生命周期

4.Mysql事务

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

4.Mysql事务

innodb_flush_log_at_trx_commit(影响的是事务执行了commit提交之后数据的写入问题以及日志刷新问题<影响的是日志刷新问题>)主要是redo文件4.Mysql事务

8.事务的使用与建议

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