来来来!我给你演示下高并发场景下的数据库事务调优

数据库事务是访问可能操作各种数据项的一个数据库操作序列 , 这些操作要么全部成功 , 要么全部失败 。 提起事务 , 大家都知道ACID属性 , 这些特性在前边的文章里都有详细的讲解 , 感兴趣的可以通过历史文章查看 。在Java中有并发编程 , 可以多线程并发执行 , 并发可以提高程序执行的效率 , 也会带来线程安全的 。 数据库事务和多线程一样 , 为了提高数据库处理事务的吞吐量 , 数据库也支持并发事务 , 在并发处理数据的过程中 , 也存在着安全问题 。
我们本文将从并发事务可能引发的问题、解决并发问题、MySQL的锁机制、锁的实现等方面逐渐深入 , 探讨高并发场景下的事务调优问题 。
并发事务可能引发的问题####1.数据丢失
来来来!我给你演示下高并发场景下的数据库事务调优文章插图
####2.脏读、
来来来!我给你演示下高并发场景下的数据库事务调优文章插图
####3.幻读
来来来!我给你演示下高并发场景下的数据库事务调优文章插图
####4.不可重复读
来来来!我给你演示下高并发场景下的数据库事务调优文章插图
事务隔离解决的并发问题 数据丢失可以基于数据库中的悲观锁来避免发生 , 即在查询时通过在事务中使用 select xx for update 语句来实现一个排他锁 , 保证在该事务结束之前其他事务无法更新该数据 。? 我们也可以基于乐观锁来避免 , 即将某一字段作为版本号 , 如果更新时的版本号跟之前的版本一致 , 则更新 , 否则更新失败 。 剩下3 个问题 , 其实是数据库读一致性造成的 , 需要数据库提供一定的事务隔离机制来解决 。
MySQL 的锁机制InnoDB实现了两种类型的锁机制:共享锁(S)和排他锁(X) 。 共享锁允许一个事务读数据 , 不允许修改数据 , 如果其他事务要再对该行加锁 , 只能加共享锁;排他锁是修改数据时加的锁 , 可以读取和修改数据 , 一旦一个事务对该行数据加锁 , 其他事务将不能再对该数据加任务锁 。
不同的锁机制会产生不同的事务隔离级别 , 不同的隔离级别分别可以解决并发事务产生的问题 , 如读未提交、读已提交、可重复读、可序列化等 。 (1号发的《MySQL的事务隔离级别和长事务 , 看这一篇就够了》一文中有介绍过)
InnoDB中的读已提交和可重复读隔离事务是基于多版本并发控制(MVCC)实现高性能事务 。 一旦数据被加上排他锁 , 其他的事务将无法加入共享锁 , 且处于阻塞等待状态 , 如果一张表有大量的请求 , 这样的性能将是无法支持的 。
MVCC对普通的Select 不加锁 , 如果读取的数据正在执行delete或者update操作 , 这时读取操作不会等待排他锁的释放 , 而是直接利用MVCC读取该行的数据快照 。 MVCC避免了对数据重复加锁的过程 , 大大提高了毒草在的性能 。 (数据快照是指在该行的之前版本的数据 , 而数据快照的版本是基于undo实现的 , undo是用来做事务回滚的 , 记录了回滚的不同版本的行记录)
锁的具体实现算法InnoDB既实现了行锁 , 也实现了表锁 , 行锁是通过索引实现的 , 如果不通过索引条件检索数据 , 那么InnoDB将表中所有的记录进行加锁 , 其实就是升级为表锁 。
行锁的具体实现算法有三种:record lock、gap lock和next-key lock 。 record lock是专门对索引项加锁;gap lock是对索引项之间的间隙加锁 , next-key lock则是前面两种的组合 , 对索引项及其之间的间隙加锁 。
只在可重复读或以上隔离级别下的特定操作才会取得 gap lock 或 next-key lock , 在 Select 、Update 和 Delete 时 , 除了基于唯一索引的查询之外 , 其他索引查询时都会获取 gap lock 或 next-key lock , 即锁住其扫描的范围 。
优化高并发事务上边的讲解 , 都是为了对事务、锁和隔离级别更加深入了解 , 下边将聊聊高并发场景下的事务是如何调优的 。

  1. 结合业务场景 , 使用低级别事务隔离
在高并发业务中 , 为了保证业务数据的一致性 , 操作数据库时往往会使用不同级别的事务隔离 , 隔离等级越高 , 并发性能就越低 。
那在实际的业务中 , 我们要如何选择呢 , 下边举两个例子:
在修改用户的最后登录时间 , 或者用户的个人资料等数据时 , 这些数据都只有用户自己登录和登陆后才会修改 , 不存在一个事务提交的信息被覆盖的可能 , 所以这样的业务我们就最低的隔离级别 。
如果账户的余额或者积分的消费 , 就可能存在多个客户端同时消费一个账户的情况 , 此时我们应该选择可重复读隔离级别 , 来保证当一个客户端在操作的时候 , 其他客户端不能对该数据进行操作 。