我有一个用例,需要同时从四个spark作业更新postgresql表中的相同行。spark作业正在使用jdbc中的“executeupdate()”更新同一个表。spark作业是流式作业,需要连续存储数据。
我正在考虑使用基于行的锁或基于表的锁来解决死锁问题。我下面的假设正确吗?
基于行的锁
在每个spark作业中,我在executeupdate中运行的sql语句周围添加“begin”和“commit”。然后,我添加“selectxxforupdate”来显式锁定每个spark作业中受影响行的行。在我的理解中,下一个spark作业将自动等待基于行的锁被释放,以便对上一个作业中受影响的行执行update语句。
基于表的锁
在每个spark作业中,我在executeupdate中运行的sql语句周围添加了“begin”、“lock table”、“commit”。在我的理解中,显式的lock命令将在事务期间锁定整个表。当第二个spark作业试图锁定表时,它将等待第一个spark作业释放锁。
上述方法是否适用于解决死锁问题?因为spark作业是流式作业,所以我更喜欢基于行的作业,这样可以节省等待时间。有更好的解决办法吗?谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!