Trouble with transactions

32
Trouble with transactions Evan Jones http://evanjones.ca

description

Trouble with transactions. Evan Jones http:// evanjones.ca. A love story. A short love story. I fell in love …. A short love story. …with transactions. …with transactions. 💖. 💖. 💖. Transactions =. correct programs. A four year romance. A four year romance. - PowerPoint PPT Presentation

Transcript of Trouble with transactions

Page 1: Trouble with transactions

Trouble with transactionsEvan Jones

http://evanjones.ca

Page 2: Trouble with transactions

A love story

Page 3: Trouble with transactions

A short love story

Page 4: Trouble with transactions

A short love storyI fell in love…

Page 5: Trouble with transactions

…with transactions

Page 6: Trouble with transactions

…with transactions💖

💖💖

Page 7: Trouble with transactions

Transactions =correct

programs

Page 8: Trouble with transactions

A four year romance

Page 9: Trouble with transactions

A four year romance

Main memory transactions

Page 10: Trouble with transactions

A four year romance

Main memory transactions

Automatic partitioning

Page 11: Trouble with transactions

A four year romance

Main memory transactions

Consolidating workloads

Automatic partitioning

Page 12: Trouble with transactions

A four year romance

Main memory transactions

Consolidating workloads

Automatic partitioning

Page 13: Trouble with transactions
Page 14: Trouble with transactions

Applications, not databases

Page 15: Trouble with transactions

connection.begin_transaction()print connection.query_balance()# ... do some computation ...print connection.query_balance()connection.commit()

Example: Read bank balance

Page 16: Trouble with transactions

connection.begin_transaction()print connection.query_balance()# ... do some computation ...print connection.query_balance()connection.commit()

= $1000

Example: Read bank balance

Page 17: Trouble with transactions

connection.begin_transaction()print connection.query_balance()# ... do some computation ...print connection.query_balance()connection.commit()

= $1000

= $1500

Example: Read bank balance

Page 18: Trouble with transactions

connection.begin_transaction()print connection.query_balance()# ... do some computation ...print connection.query_balance()connection.commit()

= $1000

= $1500 ��

Example: Read bank balance

Page 19: Trouble with transactions

💔#1: Weak defaults

Transactions = Serializability

Postgres: Read committedMySQL/InnoDB: “Repeatable read”

(reality: something weird)

Page 20: Trouble with transactions

💔#1: Weak defaults

Transactions = Serializability 💖

Postgres: Read committedMySQL/InnoDB: “Repeatable read”

(reality: something weird)

Page 21: Trouble with transactions

💔#1: Weak defaults

Transactions = Serializability 💖

Postgres: Read committedMySQL/InnoDB: “Repeatable read”

(reality: something weird)

Set SERIALIZABLE by default

Page 22: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

Example 2: Withdrawal

Page 23: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

Example 2: Withdrawal

= $1000

Page 24: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

Example 2: Withdrawal

= $1000= okay!

Page 25: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

Example 2: Withdrawal

= $1000= okay!Exception

Page 26: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

Example 2: Withdrawal

= $1000= okay!Exception

= $500

Page 27: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

💔

Example 2: Withdrawal

= $1000= okay!Exception

= $500

Page 28: Trouble with transactions

try: connection.begin_transaction() balance = connection.query_balance() connection.update_balance(balance – 500) some_function(connection) connection.commit()except e: connection.rollback() print connection.query_balance()

💔

Example 2: Withdrawal

= $1000= okay!Exception

= $500

Page 29: Trouble with transactions

💔#2: Implicit begin

some_function committed (my fault)DB automatically started new txn

Page 30: Trouble with transactions

💔#2: Implicit begin

some_function committed (my fault)DB automatically started new txn

If you begin, you commit

Like memory in C/C++Nested transactions can helpDon’t implicitly start transactions

Page 31: Trouble with transactions

Transactions: Use with care

• Communication with external systems

• Accidental long running transactions• Retry loops for concurrency errors

Page 32: Trouble with transactions

Transactions: Use with care

• Communication with external systems• Accidental long running transactions• Retry loops for concurrency errors

Make it hard to use systems incorrectly

http://evanjones.ca/