mysql补充(5)(事务,事务属性)

事务的概念

事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,
比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,
如果在此过程种出现了差错,比如有一条SQL语句没有执行成功,那么这一组操作都将全部回滚

事务特性(ACID)

Atomic(原子性):要么都成功,要么都失败
Consistent(一致性):数据应该不被破坏 
Isolate(隔离性):用户间操作不相混淆
Durable(持久性):永久保存

Spring提供了两种事务管理方式

编程式事务管理

编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,
比如你可以通过程序代码来控制你的事务何时开始,何时结束等,与后面介绍的声明式事务管理相比,它可以实现细粒度的事务控制,
例如jdbc,hibernate,spring中不提倡使用。
Hibernate的事务操作:
public void save(){
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Info info = new Info("播客");
    info.setContent("最强的java");
    session.save(info );
    session.getTransaction().commit();
      }
JDBC的事务操作:
Connection conn = null;
     try {
      .......
     conn.setAutoCommit(false);
     Statement stmt = conn.createStatement();
     stmt.executeUpdate("update person where name='叶天'");
     conn.commit();
     .....
     } catch (Exception e) {
       conn.rollback();  } 
finally{conn.close();}

声明式事务管理

如果你并不需要细粒度的事务控制,你可以使用声明式事务,
在Spring中,你只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合,
这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP的概念。
当你不需要事务管理的时候,可以直接从Spring配置文件中移除该设置

spring的事务管理器

spring没有直接管理事务,而是将管理事务的责任委托给相应的持久性机制所提供的某个特定平台的事务实现

事务管理器实现

目标

org.springframework.jdbc.datasource.DataSourceTransactionManager

在单一的JDBC Datasource中的管理事务

org.springframework.orm.hibernate3.HibernateTransactionManager

当持久化机制是hibernate时,用它来管理事务

org.springframework.jdo.JdoTransactionManager

当持久化机制是Jdo时,用它来管理事务。

org.springframework.transaction.jta.JtaTransactionManager

使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用

org.springframework.orm.ojb.PersistenceBrokerTransactionManager

当apache的ojb用作持久化机制时,用它来管理事务。

理解事务属性

@Transactional(isolation=Isolation.DEFAULT,
rollbackFor=ArithmeticException.class,
readOnly
=false,
propagation=Propagation.REQUIRED)

隔离级别:并发访问下数据库的全安性

异常回滚:遇到特定的异常才回滚

(事务超时:事务的最长持续时间,如果事务一直没有提交或回滚,那么超出该时间后,系统将自动回滚事务,单位秒。-1表示不超时,最终由底层数据库系统决定。)

只读状态:只读事务不修改任何数据,可以优化查询操作。

传播行为:定义关于客户端和被调用方法的事物边界

理解事务属性--事物传播规则

传播行为

意义

REQUIRED

业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务

NOT_SUPPORTED

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

REQUIRESNEW

属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行

MANDATORY

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

SUPPORTS

这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行

Never

指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行

NESTED

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

数据库系统提供了四种事务隔离级别

不同的隔离级别采用不同的方式来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。

大多数据库默认的隔离级别为Read Commited如SqlServer,Oracle

当然也有少部分数据库默认的隔离级别为Repeatable_Read如Mysql,

Oracle数据库支持READ COMMITTED和SERIALIZABLE两种事务隔离性级别,不支持READ UNCOMMITTED和REPEATABLE READ这两种隔离性级别。
虽然SQL标准定义的默认事务隔离性级别是SERIALIZABLE,
但是Oracle数据库默认使用的事务隔离性级别却是READ COMMITTED.

 

posted @ 2017-04-18 18:13  假程序猿  阅读(461)  评论(0)    收藏  举报