@@ -29,10 +29,16 @@ class Tag2 < ActiveRecord::Base
29
29
self . table_name = "tags"
30
30
end
31
31
32
+ class Dog < ARUnit2Model
33
+ self . table_name = "dogs"
34
+ end
35
+
32
36
setup do
33
37
Tag . establish_connection :arunit
34
38
Tag2 . establish_connection :arunit
39
+ Dog . establish_connection :arunit2
35
40
Tag . destroy_all
41
+ Dog . destroy_all
36
42
end
37
43
38
44
# It is impossible to properly test read uncommitted. The SQL standard only
@@ -62,16 +68,16 @@ class Tag2 < ActiveRecord::Base
62
68
assert_equal 1 , Tag . count
63
69
end
64
70
65
- test "default_isolation_level " do
66
- assert_nil Tag . default_isolation_level
71
+ test "pool_transaction_isolation_level " do
72
+ assert_nil Tag . pool_transaction_isolation_level
67
73
68
74
events = [ ]
69
75
ActiveSupport ::Notifications . subscribed (
70
76
-> ( event ) { events << event . payload [ :sql ] } ,
71
77
"sql.active_record" ,
72
78
) do
73
- Tag . with_default_isolation_level ( :read_committed ) do
74
- assert_equal :read_committed , Tag . default_isolation_level
79
+ Tag . with_pool_transaction_isolation_level ( :read_committed ) do
80
+ assert_equal :read_committed , Tag . pool_transaction_isolation_level
75
81
Tag . transaction do
76
82
Tag . create! ( name : "jon" )
77
83
end
@@ -80,24 +86,24 @@ class Tag2 < ActiveRecord::Base
80
86
assert_begin_isolation_level_event ( events )
81
87
end
82
88
83
- test "default_isolation_level cannot be set within open transaction" do
89
+ test "pool_transaction_isolation_level cannot be set within open transaction" do
84
90
assert_raises ( ActiveRecord ::TransactionIsolationError ) do
85
91
Tag . transaction do
86
- Tag . with_default_isolation_level ( :read_committed ) { }
92
+ Tag . with_pool_transaction_isolation_level ( :read_committed ) { }
87
93
end
88
94
end
89
95
end
90
96
91
- test "default_isolation_level but transaction overrides isolation" do
92
- assert_nil Tag . default_isolation_level
97
+ test "pool_transaction_isolation_level but transaction overrides isolation" do
98
+ assert_nil Tag . pool_transaction_isolation_level
93
99
94
100
events = [ ]
95
101
ActiveSupport ::Notifications . subscribed (
96
102
-> ( event ) { events << event . payload [ :sql ] } ,
97
103
"sql.active_record" ,
98
104
) do
99
- Tag . with_default_isolation_level ( :read_committed ) do
100
- assert_equal :read_committed , Tag . default_isolation_level
105
+ Tag . with_pool_transaction_isolation_level ( :read_committed ) do
106
+ assert_equal :read_committed , Tag . pool_transaction_isolation_level
101
107
102
108
Tag . transaction ( isolation : :repeatable_read ) do
103
109
Tag . create! ( name : "jon" )
@@ -108,6 +114,99 @@ class Tag2 < ActiveRecord::Base
108
114
assert_begin_isolation_level_event ( events , isolation : "REPEATABLE READ" )
109
115
end
110
116
117
+ test "with_transaction_isolation_level explicit transaction" do
118
+ assert_nil ActiveRecord . default_transaction_isolation_level
119
+
120
+ events = [ ]
121
+ ActiveSupport ::Notifications . subscribed (
122
+ -> ( event ) { events << event . payload [ :sql ] } ,
123
+ "sql.active_record" ,
124
+ ) do
125
+ assert_nil Tag . connection_pool . pool_transaction_isolation_level
126
+ assert_nil Dog . connection_pool . pool_transaction_isolation_level
127
+
128
+ ActiveRecord . with_transaction_isolation_level ( :read_committed ) do
129
+ assert_equal :read_committed , ActiveRecord . default_transaction_isolation_level
130
+ Tag . transaction do
131
+ assert_equal :read_committed , Tag . connection_pool . pool_transaction_isolation_level
132
+ assert_equal :read_committed , Dog . connection_pool . pool_transaction_isolation_level
133
+
134
+ Tag . create! ( name : "jon" )
135
+ Dog . create!
136
+ end
137
+ end
138
+ end
139
+
140
+ assert_nil Tag . connection_pool . pool_transaction_isolation_level
141
+ assert_nil Dog . connection_pool . pool_transaction_isolation_level
142
+ assert_begin_isolation_level_event ( events , count : 2 )
143
+ end
144
+
145
+ test "with_transaction_isolation_level implicit transaction" do
146
+ assert_nil ActiveRecord . default_transaction_isolation_level
147
+
148
+ events = [ ]
149
+ ActiveSupport ::Notifications . subscribed (
150
+ -> ( event ) { events << event . payload [ :sql ] } ,
151
+ "sql.active_record" ,
152
+ ) do
153
+ ActiveRecord . with_transaction_isolation_level ( :read_committed ) do
154
+ assert_equal :read_committed , ActiveRecord . default_transaction_isolation_level
155
+
156
+ Tag . create! ( name : "jon" )
157
+ Dog . create!
158
+ end
159
+ end
160
+
161
+ assert_begin_isolation_level_event ( events , count : 2 )
162
+ end
163
+
164
+ test "with_transaction_isolation_level cannot be set within open transaction" do
165
+ Tag . transaction do
166
+ assert_raises ( ActiveRecord ::TransactionIsolationError ) do
167
+ ActiveRecord . with_transaction_isolation_level ( :repeatable_read ) do
168
+ Tag . create! ( name : "some tag" )
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ test "with_transaction_isolation_level cannot be changed within the block" do
175
+ Tag . transaction do
176
+ assert_raises ( ActiveRecord ::TransactionIsolationError ) do
177
+ ActiveRecord . with_transaction_isolation_level ( :repeatable_read ) do
178
+ Tag . transaction do
179
+ ActiveRecord . with_transaction_isolation_level ( :serializable ) do
180
+ assert_raises do
181
+ Tag . create! ( name : "some tag" )
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ test "with_transaction_isolation_level but transaction overrides isolation" do
191
+ assert_nil ActiveRecord . default_transaction_isolation_level
192
+
193
+ events = [ ]
194
+ ActiveSupport ::Notifications . subscribed (
195
+ -> ( event ) { events << event . payload [ :sql ] } ,
196
+ "sql.active_record" ,
197
+ ) do
198
+ ActiveRecord . with_transaction_isolation_level ( :read_committed ) do
199
+ assert_equal :read_committed , ActiveRecord . default_transaction_isolation_level
200
+
201
+ Dog . transaction ( isolation : :repeatable_read ) do
202
+ Dog . create!
203
+ end
204
+ end
205
+ end
206
+
207
+ assert_begin_isolation_level_event ( events , isolation : "REPEATABLE READ" )
208
+ end
209
+
111
210
# We are testing that a nonrepeatable read does not happen
112
211
if ActiveRecord ::Base . lease_connection . transaction_isolation_levels . include? ( :repeatable_read )
113
212
test "repeatable read" do
@@ -154,11 +253,11 @@ class Tag2 < ActiveRecord::Base
154
253
end
155
254
156
255
private
157
- def assert_begin_isolation_level_event ( events , isolation : "READ COMMITTED" )
256
+ def assert_begin_isolation_level_event ( events , isolation : "READ COMMITTED" , count : 1 )
158
257
if current_adapter? ( :PostgreSQLAdapter )
159
- assert_equal 1 , events . select { _1 . match ( /BEGIN ISOLATION LEVEL #{ isolation } / ) } . size
258
+ assert_equal count , events . select { _1 . match ( /BEGIN ISOLATION LEVEL #{ isolation } / ) } . size
160
259
else
161
- assert_equal 1 , events . select { _1 . match ( /SET TRANSACTION ISOLATION LEVEL #{ isolation } / ) } . size
260
+ assert_equal count , events . select { _1 . match ( /SET TRANSACTION ISOLATION LEVEL #{ isolation } / ) } . size
162
261
end
163
262
end
164
263
end
0 commit comments