Bootstrap

解决问题——1:两个进程同时操作一个数据库表,如何控制事务以及成功执行程序?

背景

环境

  • Oracle 12c 数据
  • 批量服务器N
  • 应用服务器M

情景

如图

  1. 同一时点服务器N要truncat数据,服务器M则要向表中插入数据
  2. Oracle行级锁,truncat操作权限不如insert操作高
  3. 导致N的业务无法执行下去并报错

思路

未解决上面情境中的问题提供几种设想

1. 建立中间队列服务器,在N执行事务时停止对M的支持

思路1
当然,不仅仅是停止对M的支持,这种只是最简单粗暴的方式,可以根据条件进行队列筛选,执行应该执行的动作。服务器X可有可无,只要有功能可以充当队列管理者即可,这种方式的优点是不会大面积影响其他程序业务,缺点是由于队列管理方式较为复杂,管理程序短期不可能实现。

2. 保持原样不变,但两个原本操作同一个表的,改为不同表,建立数据同步机制

思路2
这个思路就很简单了,服务器N主要操作数据表X,并定期truncate数据Y,而服务器M业务主要操作Y,使用数据Y+X比Y多出来的补集,这种方式的优点是两个数据不受影响,最大程度避免的数据库事务的问题,但是缺点也同样明显,改造时服务器M的大量业务程序需要改动,在N定期truncate数据Y的时候,仍然存在服务器M正在操作数据Y的风险。

;