Hibernate 事务传播和隔离属性

来源:互联网 发布:淘宝搭配套餐怎么设置 编辑:程序博客网 时间:2024/04/29 20:53

事务传播属性:

事务传播行为可以由事务属性propagation指定,Spring定义了7种传播行为,这些行为在org.springframework.transaction.TransactionDefinition接口中定义。

REQUIRED:如果现有的事务正在进行,当前方法应该在这个事务中运行,否则,它应该启动新事务,并在自己的事务中运行。

REQUIRES_NEW:当前方法必须启动新事物,并在自己的事务中运行,如果现有的事务正在进行,它应该挂起。

SUPPORTS:如果现有事务正在进行,当前方法应该运行在该事务中,否则,它没有必要运行在事务中。

NOT_SUPPORTED:当前方法不应该运行在事务中。如果现有事务正在运行,它应该挂起。

MANDATORY:当前方法必须运行于一个事务中,如果没有事务在进行中,将抛出一个异常。

NEVER:当前方法不应该运行于事务中,如果现有事务在运行中,将抛出异常。

NESTED:如果现有事务正在运行,当前方法应该运行在嵌套的事务中,否则它应该启动一个新事务并运行在自己的事务中,这种功能是Spring特有的。该行为对于批处理等情况有用,在这种情况下,你需要处理很长的处理过程,而你希望在批处理中每次提交大量的记录,所以你每隔10000个记录提交一次,如果出现某种错误,你回滚嵌套的事务,仅仅丢失10000条记录。


隔离事务属性:

当相同应用或不同应用的多个事务同时在同一数据集上操作时,可能发生许多不可预期的问题。你必须指定事务互相隔离的预期方式。

理论上,事务应该完全互相隔离。但是,这种隔离级别对性能有很大的影响,因为事务必须顺序运行。事实上,事务可以运行于较低的隔离级别,以便改进性能。

事务的隔离级别可以由isolation事务属性指定。Spring支持5中隔离级别。

DEFAULT:使用底层数据库的默认隔离级别。对于大部分数据库,默认隔离级别是READ_COMMITTED;

READ_UNCOMMITTED:允许事务读取其他事务的未提交修改。可能发生读脏数据、不可重复读和幻读问题;

READ_COMMITTED:仅允许事务读取其他事务已提交的修改。能避免读脏数据问题,但是不可重复读和幻读问题仍然可能发生。

REPEATABLE_READ:确保事务能够多次从一个字段读到相同值。在本事务期间,其他事务的更新被禁止。能避免读脏数据和不可重复读问题,但是幻读问题仍然可能发生。

SERIALIZABLE:确保一个事务能从表中多次读取相同的行。在事务期间,其他事务做出的对表的插入、更新和删除将被禁止。能避免所有并发性问题,但是性能很很低。





0 0
原创粉丝点击