本发明专利技术公开一种解决并发批量更新数据库而引起死锁问题的方法,其由事务管理器、事务执行集合和事务等待队列组件组成;事务管理器是事务的协调者,负责将事务从事务等待队列中取出并执行;事务执行集合是正在执行事务的数据集合,正在执行事务的数据间无任何交集,相互独立;事务等待队列是用于存放事务及事务数据的、拥有有限长度的有序队列,若提交的事务数据与正在执行的事务数据发生碰撞,设定一个分数和超时时间,存入事务等待队列中,分数用于设定等待事务的执行优先级,分数越高得到优先执行的机会越高,设定超时时间用于事务长时间未能得到执行而主动放弃执行机会的一种策略。以上组件的引入正是为了避免正在执行的事务间发生数据碰撞,数据存在交集,而引发死锁问题。问题。
【技术实现步骤摘要】
一种解决并发批量更新数据库而引起死锁问题的方法
[0001]本专利技术涉及互联网信息技术数据处理
,具体涉及一种解决并发批量更新数据库而引起死锁问题的方法。
技术介绍
[0002]在互联网电商环境下,大量用户同时抢购商品是一种常态,为了提高系统的快速响应能力,系统通常会对商品库存执行批量更新操作,以此提升用户体验。使用InnoDB存储引擎的数据库管理系统为了保证数据的一致性,在执行更新的过程中采用行锁策略,这就为执行批量更新导致死锁埋下了隐患。具体过程如下,有A(1,3,4)、B(3,1,5)两个事务同时执行,A事务首先获得id=1的行锁执行更新,B事务获得id=3的行锁执行更新,这时A事务请求id=3的行锁,但该锁被B事务持有,A事务只能等待该锁的释放,与此同时B事务请求获得id=1的行锁,同样的,该锁被A事务持有,B事务只能等待该锁的释放,造成AB两事务相互等待的死锁现象,各自都无法继续对后续数据执行更新,无法提交事务。
[0003]为了解决批量更新的死锁问题,目前业界提出了若干方法,一是将执行批量更新的SQL语句拆分成单个SQL语句循环执行,这种方法会造成更新效率的降低,违背了批量更新的初衷,同时循环执行单SQL并不能解决死锁问题;二是在执行批量更新之前先对数据进行排序,还是以AB事务为例,排序后A事务的更新顺序为(1,3,4),B事务更新顺序为(1,3,5),AB事务同时执行,首先A事务获得id=1的行锁,执行更新,于此同时B事务请求获得id=1的行锁,但该锁由于被A持有,只能等待A事务更新完所有数据以后释放锁才能请求成功,B事务才得以更新和提交,该方法依然未能彻底解决死锁问题,只是降低了死锁的概率,若AB两事务的更新顺序分别为(1,3,4)、(3,4,5),死锁问题必然会发生;三是使用主键更新,在未创建索引的数据表执行批量更新时,InnoDB会直接使用表锁而非行锁,执行效率大大降低,若存在索引则锁住索引,因此为了最小化锁的范围,使用主键索引最为合适,实际上上述案例分析正是基于主键索引而言的;四是缩小事务作用范围,在执行数据查询和逻辑处理时避免开启事务,只有等待数据准备好以后再开启事务,这样可以避免因长事务问题而引起超时回滚,降低事务作用时间可降低因数据碰撞而引起死锁的概率,但这非彻底解决死锁问题。
技术实现思路
[0004]针对现有技术中由于正在执行的事务间发生数据碰撞,数据存在交集,而引发死锁问题,本专利技术提供一种解决并发批量更新数据库而引起死锁问题的方法,实现各事务的数据之间相互独立,相互间不存在重复的部分,事务间彼此互不影响,可高效完成事务的提交工作。
[0005]具体技术方案如下:
[0006]一种解决并发批量更新数据库而引起死锁问题的方法由事务管理器、事务执行集合和事务等待队列组件完成,
[0007]事务管理器是事务的协调者,负责将事务从事务等待队列中取出并执行;
[0008]事务执行集合是正在执行事务的数据集合,正在执行事务的数据间无任何交集,各自相互独立;
[0009]事务等待队列是一种用于存放事务及事务数据的、拥有有限长度的有序队列,若提交的事务数据与正在执行的事务数据发生碰撞,给事务指定一个分数和超时时间,然后存入事务等待队列中;分数用于设定等待事务的执行优先级,分数越高也有机会得到优先执行的机会;超时时间用于若事务等待的时间超过设定的超时时间,事务仍然未得到执行而主动放弃执行机会,快速响应请求失败的一种策略。
[0010]本专利技术提出的方法包括以下步骤:
[0011]步骤Step1:系统初始化,根据系统资源状况设置事务等待队列长度,事务缺省等待时间,事务缺省入队分数机制;
[0012]步骤Step2:业务系统查询数据,处理业务逻辑,准备好批量更新的数据、事务等待时间参数及入队分数参数后开启事务;
[0013]步骤Step3:事务管理器将准备更新的事务数据与正在更新的事务数据求一次交集;
[0014]步骤Step4:若存在交集,转入步骤Step5,若不存在交集,转入步骤Step6;
[0015]步骤Step5:事务管理器根据事务开启的参数将事务加入有序的事务等待队列中;
[0016]步骤Step6:事务管理器将准备更新的事务数据添加进正在执行的事务数据集合中;
[0017]步骤Step7:事务管理器通知客户端开始批量更新数据,执行事务;
[0018]步骤Step8:客户端执行完事务后提交事务,通知事务管理器;
[0019]步骤Step9:事务管理器收到事务提交事件后,删除该事务在事务执行集合中的事务数据;
[0020]步骤Step10:事务管理器从事务等待队列中取出分数最高的事务及事务数据,转入步骤Step3。
[0021]队列长度用于设定系统资源既能充分利用,又不至于因负载过大了响应缓慢的一种系统参数,过短的队列会导致在高并发场景下,事务提交的成功率低,过长的队列会导致事务提交响应缓慢,无法得到快速的响应。
[0022]该专利的有益之处是:
[0023]通过上述方法步骤,可确保正在执行的事务间数据不会发生重叠而引发死锁问题,引入的事务等待队列可确保事务数据在发生碰撞后仍有机会执行,队列长度、超时时间和入队分数参数能有效提高系统高效快速的执行批量事务数据更新的能力。
具体实施方式:
[0024]一种解决并发批量更新数据库而引起死锁问题的方法由事务管理器、事务执行集合和事务等待队列组件完成,
[0025]事务管理器是事务的协调者,负责将事务从事务等待队列中取出并执行;
[0026]事务执行集合是正在执行事务的数据集合,正在执行事务的数据间无任何交集,各自相互独立;
[0027]事务等待队列是一种用于存放事务及事务数据的、拥有有限长度的有序队列,若提交的事务数据与正在执行的事务数据发生碰撞,给事务指定一个分数和超时时间,然后存入事务等待队列中;分数用于设定等待事务的执行优先级,分数越高也有机会得到优先执行的机会;超时时间用于若事务等待的时间超过设定的超时时间,事务仍然未得到执行而主动放弃执行机会,快速响应请求失败的一种策略。
[0028]本专利技术提出的方法包括以下步骤:
[0029]步骤Step1:系统初始化,根据系统资源状况设置事务等待队列长度,事务缺省等待时间30秒,事务缺省入队分数机制应用时间戳;
[0030]步骤Step2:业务系统查询数据,处理业务逻辑,准备好批量更新的数据、事务等待时间参数及入队分数参数后开启事务;
[0031]步骤Step3:事务管理器将准备更新的事务数据与正在更新的事务数据求一次交集;
[0032]步骤Step4:若存在交集,转入步骤Step5,若不存在交集,转入步骤Step6;
[0033]步骤Step5:事务管理器根据事务开启的参数将事务加入有序的事务等待队列中;
[0034]步骤Step6:事务管理器将准备更新的事务数据添加本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种解决并发批量更新数据库而引起死锁问题的方法,其特征在于,由事务管理器、事务执行集合和事务等待队列组件相互协作,而避免事务数据的碰撞,事务管理器是事务的协调者,负责将事务从事务等待队列中取出并执行;事务执行集合是正在执行事务的数据集合,正在执行事务的数据间无任何交集,各自相互独立;事务等待队列是一种用于存放事务及事务数据的、拥有有限长度的有序队列,若提交的事务数据与正在执行的事务数据发生碰撞,给事务设定一个分数和超时时间,然后存入事务等待队列中;分数用于设定等待事务的执行优先级,分数越高得到优先执行的机会越大;超时时间用于设定若事务等待的时间超过设定的超时时间,事务仍然未得到执行而主动放弃执行机会,快速响应请求失败的一种策略;本发明提出的方法包括以下步骤:步骤Step1:系统初始化,根据系统资源状况设置事务等待队列长度,事务缺省等待时间,事务...
【专利技术属性】
技术研发人员:白福均,
申请(专利权)人:贵州电子商务云运营有限责任公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。