一、spring支持的事务声明方式
- 编程式事务 当系统需要明确的,细粒度的控制各个事务的边界,应选择编程式事务。
- 声明式事务 当系统对于事务的控制粒度较粗时,应该选择声明式事务
二、spring支持7种事务传播行为
| 传播行为 | 含义 |
|---|---|
| propagation_required(xml文件中为required) | 表示当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。(如果被调用端发生异常,那么调用端和被调用端事务都将回滚 |
| propagation_supports(xml文件中为supports) | 表示当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行 |
| propagation_mandatory(xml文件中为mandatory) | 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常 |
| propagation_nested(xml文件中为nested) | 表示如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同propagation_required的一样 |
| propagation_never(xml文件中为never) | 表示当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常 |
| propagation_requires_new(xml文件中为requires_new) | 表示当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行 |
| propagation_not_supported(xml文件中为not_supported) | 表示该方法不应该在一个事务中运行。如果有一个事务正在运行,它将在运行期被挂起,直到这个事务提交或者回滚才恢复执行 |
- 当业务方法被设置为propagation_mandatory时,它就不能被非事务的业务方法调用。
如将ForumService#addTopic ()设置为propagation_mandatory,如果展现层的Action直接调用addTopic()方法,将引发一个异常
正确的情况是: addTopic()方法必须被另一个带事务的业务方法调用
所以 propagation_mandatory的方法一般都是被其它业务方法间接调用的。 - 当业务方法被设置为propagation_never时,它将不能被拥有事务的其它业务方法调用。假设UserService#addCredits ()设置为propagation_never,当ForumService# addTopic()拥有一个事务时,addCredits()方法将抛出异常。所以propagation_never方法一般是被直接调用的
- 当方法被设置为propagation_not_supported时,外层业务方法的事务会被挂起,当内部方法运行完成后,外层方法的事务重新运行。如果外层方法没有事务,直接运行,不需要做任何其它的事
三、spring中的事务隔离级别
| 隔离级别 | 含义 |
|---|---|
| isolation_default | 使用数据库默认的事务隔离级别 |
| isolation_read_uncommitted | 允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读 |
| isolation_read_committed | 允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生 |
| isolation_repeatable_read | 对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生 |
| isolation_serializable | 完全服从acid隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低 |
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177497.html原文链接:https://javaforall.net
