Presentation is loading. Please wait.

Presentation is loading. Please wait.

Trouble with transactions Evan Jones

Similar presentations


Presentation on theme: "Trouble with transactions Evan Jones"— Presentation transcript:

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

2 A love story

3 A short love story

4 I fell in love…

5 …with transactions

6

7 Transactions = correct programs

8 A four year romance

9 Main memory transactions

10 A four year romance Main memory transactions Automatic partitioning

11 A four year romance Main memory transactions Consolidating workloads Automatic partitioning

12 A four year romance Main memory transactions Consolidating workloads Automatic partitioning

13

14 Applications, not databases

15 connection.begin_transaction() print connection.query_balance() #... do some computation... print connection.query_balance() connection.commit() Example: Read bank balance

16 connection.begin_transaction() print connection.query_balance() #... do some computation... print connection.query_balance() connection.commit() = $1000 Example: Read bank balance

17 connection.begin_transaction() print connection.query_balance() #... do some computation... print connection.query_balance() connection.commit() = $1000 = $1500 Example: Read bank balance

18 connection.begin_transaction() print connection.query_balance() #... do some computation... print connection.query_balance() connection.commit() = $1000 = $1500 Example: Read bank balance

19 #1: Weak defaults Transactions = Serializability Postgres: Read committed MySQL/InnoDB: “Repeatable read” (reality: something weird)

20 #1: Weak defaults Transactions = Serializability Postgres: Read committed MySQL/InnoDB: “Repeatable read” (reality: something weird)

21 #1: Weak defaults Transactions = Serializability Postgres: Read committed MySQL/InnoDB: “Repeatable read” (reality: something weird) Set SERIALIZABLE by default

22 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

23 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

24 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!

25 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

26 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

27 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

28 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

29 #2: Implicit begin some_function committed (my fault) DB automatically started new txn

30 #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 help Don’t implicitly start transactions

31 Transactions: Use with care Communication with external systems Accidental long running transactions Retry loops for concurrency errors

32 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/


Download ppt "Trouble with transactions Evan Jones"

Similar presentations


Ads by Google