Download presentation
Presentation is loading. Please wait.
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
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
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/
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.