# Two War Stories
### (in which Locking appears as a primary antagonist)
John Melesky
(PDX PUG, February 2012)
---
# Imagine, if you will...
---
# The log
SELECT * FROM definition_table WHERE defname='foobarbaz' FOR SHARE;
SELECT * FROM definition_table WHERE defname='foobarbaz' FOR SHARE;
SELECT * FROM definition_table WHERE defname='foobarbaz' FOR SHARE;
SELECT * FROM definition_table WHERE defname='foobarbaz' FOR SHARE;
SELECT * FROM definition_table WHERE defname='foobarbaz' FOR SHARE;
---
# The problem
---
# The problem
* Even read-only locks need to write
---
# The problem
* Even read-only locks need to write
* That write can have contention
---
# The solution
---
# The conclusion
---
# The conclusion
* Concurrency is baaad, mmkay?
---
# The conclusion
* Concurrency is baaad, mmkay?
* MySQL had it right all along
---
# Questions?
---
# Now, imagine....
---
# Egads! Deadlocks?
---
# The culprit(s)
SELECT * FROM sum_table WHERE sum_id = 1234
AND sum_date BETWEEN '2011-01-01' AND '2011-01-10' FOR UPDATE;
SELECT * FROM sum_table WHERE sum_id = 1234
AND sum_date BETWEEN '2011-01-03' AND '2011-01-13' FOR UPDATE;
---
# The problem
---
# The problem
* Lock acquisition is atomic
---
# The problem
* Lock acquisition is only atomic per-lock
---
# The problem
* Lock acquisition is only atomic per-lock
* Locks need to be acquired in a stable order
---
# The solution
---
# The real problem
---
# The real problem
UPDATE sum_table SET last_update = now()
WHERE sum_id = 1234
AND sum_date BETWEEN '2011-01-01' and '2011-01-10';
---
# The real solution
---
# The real solution
UPDATE sum_table SET last_update = now()
WHERE sum_id = 1234
AND sum_date BETWEEN '2011-01-01' and '2011-01-10'
ORDER BY sum_id, sum_date;
---
# The conclusion
---
# The conclusion
* Transactional atomicity is not the same as being deadlock-proof
---
# The conclusion
* Transactional atomicity is not the same as being deadlock-proof
* MySQL had it right all along
---
# The conclusion
* Transactional atomicity is not the same as being deadlock-proof
* [MySQL had it right all along](http://dev.mysql.com/doc/refman/5.5/en/update.html)
---
# The MySQL way
UPDATE t SET id = id + 1;
---
# The MySQL way
UPDATE t SET id = id + 1 ORDER BY id DESC;
---
# Questions?
---
# Thank you!