spring 声明性事务

来源:互联网 发布:完美游戏平台网络错误 编辑:程序博客网 时间:2024/06/07 10:05

事务

全有全无的操作被称为事务

ACID

Atom

原子性:保证事务中的所有操作全部发生或者全部不发生。

Consistent

一致性:一旦事务完成,不论成功或者失败,系统必须保证所建模的业务处于一致性状态。
现实的数据不应该被损坏。

Isolated

隔离性:事务允许多个用户对相同的数据进行操作,每个用户的操作不会同其他用户的纠缠在一起。
隔离性往往涉及到锁定数据库中的行或者表。

Durable

持久性:一旦事务完成,事务的结果应该持久化,这样就能从任何系统崩溃中恢复过来。
一般会将结果存放到数据库,或者其他形式的持久化存储中。

声明性事务的属性

传播行为

具体见:org.springframework.transaction.TransactionDefinition
7种

传播行为 含义 PROPAGATION_MANDATORY 表示该方法必须在事务中运行。
如果事务不存在,则会抛出异常。 PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将在嵌套事务中运行。
嵌套的事务可以独立于当前事务进行进行独立的提交和回滚。
如果当前事务不存在,则会启动一个新的事务。类似于PROPAGATION_REQUIRED。 PROPAGATION_NEVER 表示该方法不应该在事务中运行。
如果在事务中运行,则会抛出异常。 PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。
如果存在当前事物的话,在该方法运行期间,当前事务将被挂起。 PROPAGATION_REQUIRED 表示当前方法必须运行在事务当中。
如果当前事务存在,该方法在当前事务中运行。
如果当前不存在事务,则会启动一个新的事务。 PROPAGATION_REQUIRES_NEW 表示当前方法必须运行在它自己的事务当中,一个新的事务将会启动。
如果当前事务存在,则在方法执行期间,该事务会被挂起。 PROPAGATION_SUPPORTS 表示该方法不要求运行在事务中。
如果当前存在事务,则该方法会在该事务中运行。

隔离级别

无隔离措施可能出现的问题:

脏读 Dirty read

发生在一个事务读取了另一个事务改写但未提交的数据。如果改写稍后被回滚了,那么事务读取的数据就是无效的。

不可重复读 Norepeatable read

不可重复读发生在一个事务执行相同的查询两次及两次以上,但是每次都得到不同的数据时。
可能的原因:另一个并发事务在两次查询期间更新了数据。

幻读 Phantom read

与不可重复读类似。发生在一个事务t1读取了几行数据,接着另外一个并发事务t2插入了一些数据时。在随后的查询中,事务t1会发现多了一些原本不存在的记录。

隔离级别 含义 ISOLATION_DEFAULT 使用后端数据库默认的隔离级别。 ISOLATION_READ__UNCOMMITED 允许读取未提交的数据变更。
可能导致脏读、不可重复读和幻读。 ISOLATION_READ_COMMITED 允许读取并发事务已经提交的数据。
能避免脏读,但是不可重复读和幻读仍有可能发生。 ISOLATION_REPEATABLE_READ 对同一字段的多次读取结果是一致的,除非数据是被本事务自己修改的。
能避免脏读、不可重复读,但是幻读仍然有可能发生。 ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别。
能避免脏读、不可重复读和幻读。
通常是通过锁定事务相关的数据库表来实现的。

隔离级别具体见:org.springframework.transaction.TransactionDefinition

事务超时

事务执行时间超过超时时间,事务会失败,进行回滚。

是否只读

若只需要读数据库,数据库可以利用事务的只读属性进行一些优化。

回滚规则

默认情况:
运行时异常,回滚;
检查型异常,不回滚。

可以设置需要进行回滚的异常,和不需要回滚的异常

声明性事务配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                        http://www.springframework.org/schema/aop                        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd                        http://www.springframework.org/schema/tx                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"><tx:annotation-driven transaction-manager="txManager"/></beans>
0 0