Skip to content

Commit 50fa0ab

Browse files
committed
embedded db isolations are really primitive (lock the whole table)
1 parent e7a258c commit 50fa0ab

File tree

4 files changed

+122
-0
lines changed

4 files changed

+122
-0
lines changed

test/db/derby/transaction_test.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,41 @@ def test_supports_savepoints
88
assert_true ActiveRecord::Base.connection.supports_savepoints?
99
end
1010

11+
# @override whole table gets locked!
12+
def test_transaction_isolation_read_committed
13+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
14+
omit("transaction isolation not supported")
15+
end
16+
17+
Entry.transaction(:isolation => :read_committed) do
18+
assert_equal 0, Entry.count
19+
20+
Entry2.transaction do
21+
Entry2.create
22+
#assert_equal 0, Entry.count
23+
end
24+
end
25+
assert_equal 1, Entry.count
26+
end if Test::Unit::TestCase.ar_version('4.0')
27+
28+
# @override whole table gets locked!
29+
def test_transaction_isolation_repeatable_read
30+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
31+
omit("transaction isolation not supported")
32+
end
33+
34+
# NOTE need to emulate this in another thread !
35+
#entry = Entry.create(:title => '1234')
36+
37+
Entry.transaction(:isolation => :repeatable_read) do
38+
#entry.reload
39+
#Entry2.find(entry.id).update_attributes(:title => '567')
40+
41+
#entry.reload
42+
#assert_equal '1234', entry.title
43+
end
44+
#entry.reload
45+
#assert_equal '567', entry.title
46+
end if Test::Unit::TestCase.ar_version('4.0')
47+
1148
end

test/db/h2/transaction_test.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,41 @@ def test_supports_savepoints
88
assert_true ActiveRecord::Base.connection.supports_savepoints?
99
end
1010

11+
# @override whole table gets locked!
12+
def test_transaction_isolation_read_committed
13+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
14+
omit("transaction isolation not supported")
15+
end
16+
17+
Entry.transaction(:isolation => :read_committed) do
18+
assert_equal 0, Entry.count
19+
20+
Entry2.transaction do
21+
Entry2.create
22+
#assert_equal 0, Entry.count
23+
end
24+
end
25+
assert_equal 1, Entry.count
26+
end if Test::Unit::TestCase.ar_version('4.0')
27+
28+
# @override whole table gets locked!
29+
def test_transaction_isolation_repeatable_read
30+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
31+
omit("transaction isolation not supported")
32+
end
33+
34+
# NOTE need to emulate this in another thread !
35+
#entry = Entry.create(:title => '1234')
36+
37+
Entry.transaction(:isolation => :repeatable_read) do
38+
#entry.reload
39+
#Entry2.find(entry.id).update_attributes(:title => '567')
40+
41+
#entry.reload
42+
#assert_equal '1234', entry.title
43+
end
44+
#entry.reload
45+
#assert_equal '567', entry.title
46+
end if Test::Unit::TestCase.ar_version('4.0')
47+
1148
end

test/db/hsqldb/transaction_test.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,43 @@ def test_supports_savepoints
88
assert_true ActiveRecord::Base.connection.supports_savepoints?
99
end
1010

11+
# @override whole table gets locked!
12+
def test_transaction_isolation_read_committed
13+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
14+
omit("transaction isolation not supported")
15+
end
16+
17+
Entry.transaction(:isolation => :read_committed) do
18+
assert_equal 0, Entry.count
19+
20+
Entry2.transaction do
21+
Entry2.create
22+
#assert_equal 0, Entry.count
23+
end
24+
end
25+
assert_equal 1, Entry.count
26+
end if Test::Unit::TestCase.ar_version('4.0')
27+
28+
# @override whole table gets locked!
29+
def test_transaction_isolation_repeatable_read
30+
unless ActiveRecord::Base.connection.supports_transaction_isolation?
31+
omit("transaction isolation not supported")
32+
end
33+
34+
# NOTE need to emulate this in another thread !
35+
#entry = Entry.create(:title => '1234')
36+
37+
Entry.transaction(:isolation => :repeatable_read) do
38+
#entry.reload
39+
#Entry2.find(entry.id).update_attributes(:title => '567')
40+
41+
#entry.reload
42+
#assert_equal '1234', entry.title
43+
end
44+
#entry.reload
45+
#assert_equal '567', entry.title
46+
end if Test::Unit::TestCase.ar_version('4.0')
47+
1148
# @override
1249
def test_savepoint
1350
omit 'savepoins not supported' unless @supports_savepoints

test/db/sqlite3/transaction_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
class SQLite3TransactionTest < Test::Unit::TestCase
55
include TransactionTestMethods
66

7+
# @override
78
def test_supports_transaction_isolation
89
assert ActiveRecord::Base.connection.supports_transaction_isolation?
910
# NOTE: adapter tell us it supports but JDBC meta-data API returns false ?!
@@ -13,6 +14,7 @@ def test_supports_transaction_isolation
1314

1415
# supports only TRANSACTION_SERIALIZABLE and TRANSACTION_READ_UNCOMMITTED
1516

17+
# @override
1618
def test_transaction_isolation_read_committed
1719
assert ! ActiveRecord::Base.connection.supports_transaction_isolation?(:read_committed)
1820

@@ -21,6 +23,7 @@ def test_transaction_isolation_read_committed
2123
end
2224
end if Test::Unit::TestCase.ar_version('4.0')
2325

26+
# @override
2427
def test_transaction_isolation_repeatable_read
2528
assert ! ActiveRecord::Base.connection.supports_transaction_isolation?(:repeatable_read)
2629

@@ -29,6 +32,14 @@ def test_transaction_isolation_repeatable_read
2932
end
3033
end if Test::Unit::TestCase.ar_version('4.0')
3134

35+
def test_transaction_isolation_read_uncommitted
36+
Entry.transaction(:isolation => :read_uncommitted) do
37+
assert_equal 0, Entry.count
38+
Entry.create # Entry2.create
39+
assert_equal 1, Entry.count
40+
end
41+
end if Test::Unit::TestCase.ar_version('4.0')
42+
3243
def test_supports_savepoints
3344
assert_true ActiveRecord::Base.connection.supports_savepoints?
3445
end

0 commit comments

Comments
 (0)