上面是我的spring配置 问题是我用它执行删除或添加方法时报一下错误,org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.求各位过路得大大帮帮忙啊!
上次我也是这个问题,怎么解决忘了,不过你可以咋网上查一下就知道了。
这是spring的只读机制,在annotation下的配置为@Transcational(readOnly=false),xml中的配置为
TransactionDefinition接口定义了一个事务规则,该接口必须指定如下几个属性值:
● 事务隔离,当前事务和其他事务的隔离程度。例如,这个事务能否看到其他事务未提交的数据等。
● 事务传播,通常,在事务中执行的代码都会在当前事务中运行。但是,如果一个事务上下文已经存在,有几个选项可指定该事务性方法的执行行为。例如,大多数情况下,简单地在现有的事务上下文中运行;或者挂起现有事务,创建一个新的事务。Spring提供EJB CMT(Contain Manager Transaction,容器管理事务)中所有的事务传播选项。
● 事务超时,事务在超时前能运行多久。事务的最长持续时间。如果事务一直没有被提交或回滚,将在超出该时间后,系统自动回滚事务。
● 只读状态,只读事务不修改任何数据。在某些情况下(例如使用Hibernate时),只读事务是非常有用的优化。
关于只读事务:
看这里,看的时候需要明白引入只读事务的原因,找到原因之后再去理解原因就能理解了。
http://blogs.innodb.com/wp/2011/12/better-scaling-of-read-only-workloads/
增加只读事务的目的是为了判断这个事务是否是只读的,如果是只读的,则会将这个事务放在trx_sys_t::ro_trx_list中,减少copy trx_sys_t::rw_trx_list的开销以及锁导致的速度下降问题。
主要的目标是为了提高性能。
xml的配置如第一个截图的答案。关于这个tx:method可配置的选项文章:
http://blog.sina.com.cn/s/blog_4a40057401000865.html
好好理解下。