Browse Source

Grails: improved fix to issue #658, remove all transactions

Lari Hotari 11 years ago
parent
commit
0a0484e24c

+ 1 - 0
grails/hello/grails-app/conf/DataSource.groovy

@@ -27,6 +27,7 @@ dataSource {
         validationInterval=15000
         jdbcInterceptors="ConnectionState;StatementCache"
         defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED
+        defaultAutoCommit=true
         dbProperties = this.loadProperties("classpath:mysql-connection.properties")
     }
 }

+ 11 - 9
grails/hello/grails-app/controllers/hello/HelloController.groovy

@@ -7,7 +7,8 @@ import groovy.transform.TypeCheckingMode;
 
 import java.util.concurrent.ThreadLocalRandom
 
-import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.hibernate.Session;
 
 @CompileStatic
 class HelloController {
@@ -28,7 +29,6 @@ class HelloController {
     }
 
     // Test type 2: Single database query
-    @Transactional(readOnly=true)
     def db() {
         def random = ThreadLocalRandom.current()
         def world = World.read(random.nextInt(10000) + 1)
@@ -36,7 +36,6 @@ class HelloController {
     }
     
     // Test type 3: Multiple database queries
-    @Transactional(readOnly=true)
     def queries(int queries) {
         def worlds = fetchRandomWorlds(queries, false)
         render worlds as JSON
@@ -55,10 +54,15 @@ class HelloController {
         List<World> worlds = new ArrayList<World>(queries)
         if (updateAlso) {
             Arrays.sort(worldIds)
-            for (int id : worldIds) {
-                World world = World.lock(id)
-                world.randomNumber = random.nextInt(10000) + 1
-                worlds.add(world)
+            World.withSession { Session session ->
+                for (int id : worldIds) {
+                    World world = World.get(id)
+                    world.randomNumber = random.nextInt(10000) + 1
+                    worlds.add(world)
+                    // flush changes
+                    session.flush()
+                    session.clear()
+                }
             }
         } else {
             for (int id : worldIds) {
@@ -69,7 +73,6 @@ class HelloController {
     }
     
     // Test type 4: Fortunes
-    @Transactional(readOnly=true)
     def fortunes() {
         def fortunes = Fortune.getAll()
         fortunes << new Fortune(id: 0, message: 'Additional fortune added at request time.')
@@ -83,7 +86,6 @@ class HelloController {
         render worlds as JSON
     }
 
-    @Transactional(isolation=Isolation.READ_COMMITTED)
     private List updateWorlds(int queries) {
         fetchRandomWorlds(queries, true)
     }