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,也就是读已提交。