事务

来源:互联网 发布:mac 复制到移动硬盘 编辑:程序博客网 时间:2024/06/08 15:33

1,数据库事务

事务是数据库区别于文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存,要么所有修改到不保存。

1.1事务的ACID特性:原子性(Atomicity),一致性(consistency),隔离性(isolation),持久性(durability)。

原子性指整个数据库事务是不可分割的工作单位。

一致性指事务将数据库从一种状态转变为下一种一致的状态。

隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这使用锁来实现。

持久性指事务一旦提交,结果就是永久性的。

1.2事务的传播行为:

1,REQUIRED:

业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。
2,NOT_SUPPORTED:

声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。
3,REQUIRES_NEW:

不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。
4,MANDATORY:

该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
5,SUPPORTS:

该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。
6,NEVER:

该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。
7,NESTED:

如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。


1.3事务的隔离级别:

未提交读(READ UNCOMMITTED)

已提交读(READ COMMITTED)

可重复读(REPEATABLE READ):InnoDB默认隔离级别,

序列化(SERIALIZABLE)


2,spring事务,对数据库事务的二次封装。

spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。

DataSourceTransactionManager为JDBC和iBatis提供了事务支持。

HibernateTransactionManager为Hibernate提供了事务支持。

JpaTransactionManager为JPA提供了事务支持。

JtaTransactionManager为JTA提供了事务支持。JTA规定了应用程序与一个或多个数据源之间协调事务的标准API。

spring提供了编码式和声明式事务管理的支持。

编码式事务允许用户在代码中精确定义事务的边界,而声明式事务有助于用户将操作与事务规则进行解耦。声明式事务是通过使用Spring AOP框架实现的。 

声明式事务是通过事务属性来定义的。事务属性描述了事务策略如何应用到方法上。事务属性包含了5个方面:传播行为,隔离级别,只读,事务超时,回滚规则。

传播行为,隔离级别跟上面的一样。

只读:如果事务只对后端的数据库进行读操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。因为优化狮子啊事务启动的时候由数据库实施的,只对那些具备启动一个新事务的传播行为的方法来说,将事务声明为只读才有意义。

事务超时:假设事务的运行时间变得特别长。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。你可以声明一个事务,在特定的秒数后自动回滚,而不是等待其结束。因为超市时钟会在事务开始时启动,所以只有对那些具备可能启动一个新事务的传播行为的方法来说,声明事务超时才有意义。

回滚规则:回滚规规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样你可以声明遇到特定的异常不回滚,即使这些异常是运行期异常。