Mysql的事务原理与优化最佳实践

MySQL事务原理与优化方法

事务及其ACID属性

事务:

一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性(比对并发编程中的原子性)


ACID属性:

  • 原子性(Atomicity)
    当前事务的操作,要么同时成功,要么同时失败。
    原子性由undo log日志来实现

  • 一致性(Consistent)
    使用事务的最终目的,由其他3个特性以及业务代码正确逻辑来实现
    事务前后,数据应该是一致的

  • 隔离性(Isolation)
    事务并发执行时,他们内部的操作不能相互干扰。
    隔离性由各种锁以及MVCC机制来实现。

  • 持久性(Durable)
    一旦提交了事务,它对数据库的改变就应该是永久性的。
    持久性由redo log日志来实现


并发事务处理带来的问题:

  • 脏读
    事务A读到了事务B已经修改但还未提交的数据

  • 不可重复读
    事务A内部的相同查询语句在不同时刻读出的结果不一致

  • 幻读
    事务A读到了事务B提交的新增数据


事务隔离级别:

隔离级别脏读不可重复读幻读
读未提交
Read Uncommitted
可能可能可能
读已提交
Read Committed
不可能可能可能
可重复读
Repeatable Read
不可能不可能可能
串行化
Serializable
不可能不可能不可能
  • 读未提交
    事务A读到了事务B已经修改但还未提交的数据

  • 读已提交
    事务A可以读取到事务B已经提交的数据

  • 可重复读
    事务A在事务过程中,读取到的数据是一致的

  • 串行化
    事务A与事务B对相同数据的读和写操作都要并行执行。
    事务的串行化,是由各种锁来实现的
    读锁:共享锁,针对同一份数据,多个读操作可以同时进行而不会相互影响
    写锁:排它锁,针对同一份数据,会阻断其他写锁、读锁
    间隙锁:锁的是两个值之间的空隙,间隙锁在可重复读隔离级别下才会生效

Mysql5.7版本:

        查看当前数据库的事务隔离级别:show variables like 'tx_isolation';

        设置事务隔离级别:set tx_isolation='REPEATABLE-READ';

Mysql8.0版本:

        查看当前数据库的事务隔离级别:show variables like '%isolation%';

        设置事务隔离级别:set transaction_isolation='REPEATABLE-READ';

Mysql的默认隔离为:可重复读

Oracle的默认隔离级别为:读已提交

大事务的影响:

  • 并发情况下,数据库连接池容易被撑爆

  • 锁定太多数据,造成大量阻塞和锁超时

  • 执行时间长,容易造成主从延迟

  • 回滚所需要的时间比较长

  • undo log膨胀

  • 容易导致死锁

事务优化:

  • 将查询等数据准备操作放到事务外

  • 事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久

  • 事务中避免一次性处理太多数据,可以拆分成多个事务分次处理

  • 事务等设计加锁的操作尽可能放在实物靠后的位置

  • 能异步处理的尽量异步处理

  • 应用侧(业务代码)保证数据一致性,非事务执行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值