4.Mysql事务
程序员文章站
2022-05-09 15:59:09
...
事务
1定义
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
2定义事务
START TRANSACTION / BEGIN ; --开启事务
Sql语句
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
注意:事务产生异常不会自动回滚,只能手动执行ROLLBACK回滚事务。
3事务的四个特性
- 原子性:事务中的各个操作要么一起成功,要么一起失败。
- 隔离性:事务没有执行完,其他程序不允许操作。
- 一致性:根据数据库原则,保证数据执行的数量是一致的
- 永久性:数据是永久保存在磁盘中的。
4事务执行流程
重做日志:redo log => data/ib_logfile0
重新执行:事务在执行提交后,mysql停机,但是数据还没写入到磁盘中,Mysql重启后会重做日志,写入磁盘数据。
重写日志:undo log => data/ibdata
回滚数据:
1.手动执行回滚操作时会执行
2.程序在开启事务后,开始提交事务之前发生异常,在下次开启mysql时会执行
5事务生命周期
6.事务的隔离级别
并行:
- 未授权读取(RU)<0>:也叫未提交读读取 => Read Uncommitted
主要在于用作事务回滚和重做 - 共享锁 允许其他事务可以读取到正在修改的数据(事务进行中),但不允许修改
解决的问题:没有使用事务时候数据不一致的问题,就是做到所执行的sql一起成功,一起回滚
产生的问题:可以读取到其他事务所执行的sql结果 => 脏读 - 授权读取(RC)<1>:已提交读取 => Read Committed
使用排他锁,不允许其他事务读取到数据,也不允许修改,但是别的事务时排他锁就能读取到数据。
解决的问题:解决脏读
产生的问题:可以读取到其他事务已提交的数据,不可重复读 - 可重复读(RR)<2>:Repeatable Read
使用排他锁,会把读取到的数据放入缓冲区,而且会给其他事务加一把锁,其他食物就读取不到数据(会产生幻读)
解决的问题:解决脏读,不可重复读
产生的问题:幻读
单线程:
- 序列化 <3> :Serializable
问题最小,会把多线程变成单线程,并发能力低,安全性最高(不仅通过锁,还有其他机制)
解决的问题:解决脏读,不可重复读、幻读
产生的问题:效率低
从上到下隔离级别依次增加
性能从上到下依次降低,安全性从上到下增高
Mysql 默认隔离级别:可重复读取(RR)
7.事务与IO
innodb_flush_log_at_trx_commit(影响的是事务执行了commit提交之后数据的写入问题以及日志刷新问题<影响的是日志刷新问题>)主要是redo文件
8.事务的使用与建议
- .控制事务的大小(操作写的数据)
- 使用锁的时候尽量配合携带索引字段使用,避免升级为表锁
- 范围查询,尽量减少基于范围查询的事务大小; =>间隙锁
- 如果业务必须要使用锁,锁的冲突特别高 => 改为表锁
- 可以根据项目情况调节事务的 innodb_flush_log_at_trx_commit