Spring事务七大传播机制与五个隔离级别

一、spring支持7种事务传播行为

1、propagation_required(xml文件中为required)

当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。(如果被调用端发生异常,那么调用端和被调用端事务都将回滚)。

2、propagation_supports(xml文件中为supports)

当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行。

3、propagation_mandatory(xml文件中为mandatory)

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

4、propagation_nested(xml文件中为nested)

如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同propagation_required的一样。

5、propagation_never(xml文件中为never)

当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常。

6、propagation_requires_new(xml文件中为requires_new)

当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。

7、propagation_not_supported(xml文件中为not_supported)

方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执行。

二、spring中的事务隔离级别

1、isolation_default

使用数据库默认的事务隔离级别。

2、isolation_read_uncommitted

允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读。

3、isolation_read_committed

允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生。

4、isolation_repeatable_read

对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生。

5、isolation_serializable

完全服从acid隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低。

三、几种常用数据库的默认隔离级别

MySQL

mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读。

Oracle

oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。

默认系统事务隔离级别是READ COMMITTED,也就是读已提交。

SQL Server

默认系统事务隔离级别是read committed,也就是读已提交。

posted @ 2022-08-24 08:57  我来偷家了  阅读(260)  评论(0编辑  收藏  举报