事务隔离级别的困惑
事务隔离级别有read uncommited,read commited,repeatable read,serializable。一般写java应用程序指定事务隔离级别(1)在connection的setTransactionIsolation方法中指定(2)用数据库的默认级别
但是在并发事务中,以下代码用Spring的read commited事务管理级别就会出现问题
|
如果用read commited,一个事务在source.getBalance().compareTo(amount) > 0判断成功后,执行getAccountDao().updateBalance()前, 另一个并发事务修改了source的balance使balance<amount, 那么就会出现不可重复读问题,doTransfer方法也就出错了.
问题1: 用Spring的事务管理, 是应该用repeatable read 还是 serializable 作为这个方法的隔离级别?
问题2:在hibernate中,像这种问题如何处理?
1)是用悲观锁:
|
2)还是用乐观锁: versioned data
3)悲观锁能达到repeatable read还是serializable隔离级别?
问题3:如果用乐观锁, 出错后,一般是提示用户数据修改重新处理, 还是在try-catch{}语句中重新执行doTransfer()方法,重新再做一次source.getBalance().compareTo (amount) > 0判断.毕竟这种问题只有在事务并发时才会碰到,可能第二次执行就成功了.