| = Distributed Locks |
| |
| == Overview |
| |
| Ignite transactions acquire distributed locks implicitly. However, there are certain use cases when you might need to |
| acquire the locks explicitly. The `lock()` method of the `IgniteCache` API returns an instance of `java.util.concurrent.locks.Lock` |
| that lets you define explicit distributed locks for any given key. Locks can also be acquired on a collection of objects using the |
| `IgniteCache.lockAll()` method. |
| |
| [tabs] |
| -- |
| tab:Java[] |
| [source, java] |
| ---- |
| IgniteCache<String, Integer> cache = ignite.cache("myCache"); |
| |
| // Create a lock for the given key |
| Lock lock = cache.lock("keyLock"); |
| try { |
| // Acquire the lock |
| lock.lock(); |
| |
| cache.put("Hello", 11); |
| cache.put("World", 22); |
| } |
| finally { |
| // Release the lock |
| lock.unlock(); |
| } |
| ---- |
| -- |
| |
| [NOTE] |
| ==== |
| [discrete] |
| === Atomicity Mode |
| In Ignite, locks are supported only for the `TRANSACTIONAL` atomicity mode, which can be set via the |
| `CacheConfiguration.atomicityMode` parameter. |
| ==== |
| |
| == Locks and Transactions |
| |
| Explicit locks are not transactional and cannot not be used from within transactions (exception will be thrown). |
| If you do need explicit locking within transactions, then you should use the `TransactionConcurrency.PESSIMISTIC` concurrency |
| control for transactions which will acquire explicit locks for relevant cluster data requests. |