redislock.lua 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. --
  2. -- User: tianyu.li
  3. -- Date: 2021/1/19
  4. --
  5. -- init data
  6. local array = {}; local result; local keySize = ARGV[1]; local argSize = ARGV[2];
  7. -- Loop through all keys to see if they can be used , when a key is not available, exit
  8. for i= 1, keySize do
  9. -- search lock xid
  10. result = redis.call('HGET',KEYS[i],'xid');
  11. -- if lock xid is nil
  12. if (not result)
  13. -- set 'no' mean There is need to store lock information
  14. then array[i]='no'
  15. else
  16. if (result ~= ARGV[3])
  17. then
  18. -- return fail
  19. return result
  20. else
  21. -- set 'yes' mean There is not need to store lock information
  22. array[i]= 'yes'
  23. end
  24. end
  25. end
  26. -- Loop through array
  27. for i =1, keySize do
  28. -- if is no ,The lock information is stored
  29. if(array[i] == 'no')
  30. then
  31. -- set xid
  32. redis.call('HSET',KEYS[i],'xid',ARGV[3]);
  33. -- set transactionId
  34. redis.call('HSET',KEYS[i],'transactionId',ARGV[(i-1)*6+4]);
  35. -- set branchId
  36. redis.call('HSET',KEYS[i],'branchId',ARGV[(i-1)*6+5]);
  37. -- set resourceId
  38. redis.call('HSET',KEYS[i],'resourceId',ARGV[(i-1)*6+6]);
  39. -- set tableName
  40. redis.call('HSET',KEYS[i],'tableName',ARGV[(i-1)*6+7]);
  41. -- set rowKey
  42. redis.call('HSET',KEYS[i],'rowKey',ARGV[(i-1)*6+8]);
  43. -- set pk
  44. redis.call('HSET',KEYS[i],'pk',ARGV[(i-1)*6+9]);
  45. -- exit if
  46. end
  47. -- exit for
  48. end
  49. -- set SEATA_GLOBAL_LOCK
  50. redis.call('HSET',KEYS[(keySize+1)],KEYS[(keySize+2)],ARGV[(argSize+0)]);
  51. -- return success
  52. return ARGV[3]