Spring 声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的 try … catch … finally 代码。 我们在使用 Spring 声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。
Spring 在 TransactionDefinition 接口中定义这些属性 , 以供 PlatfromTransactionManager 使用 , PlatfromTransactionManager 是 spring 事务管理的核心接口。
l getTimeout() 方法,它返回事务必须在多少秒内完成。
l isReadOnly() , 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。
l getIsolationLevel() 方法返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。
在 TransactionDefinition 接口中定义了五个不同的事务隔离级别:
l ISOLATION_DEFAULT 这是一个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别 . 另外四个与 JDBC 的隔离级别相对象
l ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 例如 : Mary 的原工资为 1000, 财务人员将 Mary 的工资改为了 8000 ,但未提交事务 与此同时, Mary 正在读取自己的工资 Mary 发现自己的工资变为了 8000 ,欢天喜地! 而财务发现操作有误,而回滚了事务 ,Mary 的工资又变为了 1000. 像这样 ,Mary 记取的工资数 8000 是一个脏数据。