java中对事务的理解

一、什么是事务

  事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。

二、事务的原则(ACID)

  原子性:事务要么全部都被执行,要么就全都不被执行,如果有子事务提交失败,那么其他子事务对数据库的操作将被回滚,数据库回到事务提交前的状态;如果全部子事务都提交成功,则所有的数据库操作都会被提交;

  一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态;

  隔离性:一个事务的执行不能被其他事务所影响;

  持久性:事务一旦提交,就会永久保存在数据库中,及时数据库服务器发生故障,也不会丢失提交事务的操作。

三、事务的类型

  JDBC事务、JTA(Java Transaction API)事务、容器事务

  1、JDBC事务:在JDBC中处理事务,都是通过Connection处理的,同一事务的操作,都在一个connection对象中完成,JDBC Connection 接口提供了两种事务模式:自动提交和手工提交,JDBC事务是默认开启的,并且是默认提交。 

  java.sql.Connection 提供了以下控制事务的方法:

public void setAutoCommit(boolean)//设置是否是自动提交,true(默认值)代表自动提交,false代表需要手动提交
public void commit() //提交事务
public void rollback()//回滚事务

  jdbc操作流程:1)获取jdbc连接  2)声明sql  3)预编译sql  4)执行sql  5)处理结果集  6)释放结果集  7)释放statemen  8)提交事务  9)处理异常并回滚  10)释放jdbc连接

  2、JTA事务:JTA具有三个主要的接口:

  UserTransaction:让应用程序得以控制事务的开始、挂起、提交、回滚等;

  TransactionManager:用于应用服务器管理事务状态;

  Transaction接口:用于执行相关事务操作。

  3、spring并不直接管理事务,而是提供多种事务管理器,她们将事务管理的职责委托给hibernate获jta来实现,springs事务的管理器接口是org.springframework.transaction.PlatformTransactionManager

  (1)spring jdbc

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource" />
</bean>

   (2)hibernate事务

1 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
2      <property name="sessionFactory" ref="sessionFactory" />
3 </bean>

  (3)Java持久化API事务(JPA)

1 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
2      <property name="sessionFactory" ref="sessionFactory" />
3 </bean>

四、事务的属性

  传播行为、隔离规则、回滚规则、事务超时、是否只读

1 public interface TransactionDefinition {
2     int getPropagationBehavior(); // 返回事务的传播行为
3     int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
4     int getTimeout();  // 返回事务必须在多少秒内完成
5     boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
6 }

  7种传播行为:

    *PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

    PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

    *PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

  4种隔离级别:

  •   Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。
  •   Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
  •   Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新
  •   Read Uncomitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

    隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

猜你喜欢

转载自www.cnblogs.com/dududududududu/p/11301894.html