Today I would like to focus on another aspect of those databases - how do they handle transactions?
For an RDBMS it is quite common to support transactions, but I haven't read about transactions in the 7db7w book yet that those key-value databases support them.
Let's write a test for transactions:
package sevendatabases
import static org.junit.Assert.*
import org.junit.*
class TransactionTests extends GroovyTestCase {
static transactional = false; // 1
void setUp() {
}
@Test
void testSomething() {
def numBooks = Book.count()
Book.withTransaction { status ->
new Book (name:'test',isbn:'test').save(flush:true,failOnError:true)
}
assert Book.count() == numBooks+1
Book.withTransaction { status ->
new Book (name:'test',isbn:'test').save(flush:true,failOnError:true)
status.setRollbackOnly()
}
assert Book.count() == numBooks+1
}
}
Have you noticed the line marked with "// 1"? In grails, integration tests are executed in a transactional context by default. This causes some problems while testing the transaction itself. So I disabled the default transactional context.
Now I run this test against all of my configured databases:
MS SQL Server: works
MySQL: works
Oracle Express: works
Riak: fail! No transactionManager bean configured
...ok. I could have used the overview chart from the book to get the same results. But this way I had to figure out how to test transactiosn ins Grails :-)
No comments:
Post a Comment