|
| 1 | +use strict; |
| 2 | +use warnings; |
| 3 | + |
| 4 | +use PostgresNode; |
| 5 | +use TestLib; |
| 6 | +use Test::Moretests=> 27; |
| 7 | + |
| 8 | +# Test concurrent update in table row with different default transaction |
| 9 | +# isolation levels. |
| 10 | +my$node = get_new_node('main'); |
| 11 | +$node->init; |
| 12 | +$node->start; |
| 13 | +$node->safe_psql('postgres', |
| 14 | +'CREATE UNLOGGED TABLE xy (x integer, y integer);' |
| 15 | + .'INSERT INTO xy VALUES (1, 2);'); |
| 16 | + |
| 17 | +my$script =$node->basedir .'/pgbench_script'; |
| 18 | +append_to_file($script,"\\set delta random(-5000, 5000)\n"); |
| 19 | +append_to_file($script,"UPDATE xy SET y = y + :delta WHERE x = 1;"); |
| 20 | + |
| 21 | +# Test transactions with Read committed default isolation level: |
| 22 | +$node->command_like( |
| 23 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 24 | + --default-isolation-level=RC --file),$script ], |
| 25 | +qr{default transaction isolation level: read committed}, |
| 26 | +'concurrent update: Read Committed: check default isolation level'); |
| 27 | + |
| 28 | +$node->command_like( |
| 29 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 30 | + --default-isolation-level=RC --file),$script ], |
| 31 | +qr{processed: 50/50}, |
| 32 | +'concurrent update: Read Committed: check processed transactions'); |
| 33 | + |
| 34 | +$node->command_like( |
| 35 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 36 | + --default-isolation-level=RC --file),$script ], |
| 37 | +qr{serialization failures: 0\(0\.000 %\)}, |
| 38 | +'concurrent update: Read Committed: check serialization failures'); |
| 39 | + |
| 40 | +# Test transactions with Repeatable read default isolation level: |
| 41 | +$node->command_like( |
| 42 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 43 | + --default-isolation-level=RR --file),$script ], |
| 44 | +qr{default transaction isolation level: repeatable read}, |
| 45 | +'concurrent update: Repeatable Read: check default isolation level'); |
| 46 | + |
| 47 | +$node->command_like( |
| 48 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 49 | + --default-isolation-level=RR --file),$script ], |
| 50 | +qr{processed: 50/50}, |
| 51 | +'concurrent update: Repeatable Read: check processed transactions'); |
| 52 | + |
| 53 | +$node->command_like( |
| 54 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 55 | + --default-isolation-level=RR --file),$script ], |
| 56 | +qr{serialization failures: [1-9]\d*\([1-9]\d*\.\d* %\)}, |
| 57 | +'concurrent update: Repeatable Read: check serialization failures'); |
| 58 | + |
| 59 | +# Test transactions with Serializable default isolation level: |
| 60 | +$node->command_like( |
| 61 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 62 | + --default-isolation-level=S --file),$script ], |
| 63 | +qr{default transaction isolation level: serializable}, |
| 64 | +'concurrent update: Serializable: check default isolation level'); |
| 65 | + |
| 66 | +$node->command_like( |
| 67 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 68 | + --default-isolation-level=S --file),$script ], |
| 69 | +qr{processed: 50/50}, |
| 70 | +'concurrent update: Serializable: check processed transactions'); |
| 71 | + |
| 72 | +$node->command_like( |
| 73 | +[qw(pgbench --no-vacuum --client=5 --transactions=10 |
| 74 | + --default-isolation-level=S --file),$script ], |
| 75 | +qr{serialization failures: [1-9]\d*\([1-9]\d*\.\d* %\)}, |
| 76 | +'concurrent update: Serializable: check serialization failures'); |