Spring框架总结(4)

JDBCTemplate&事务

  1. JDBCTemplate
    1. Spring也提供了自己的持久层,即JDBCTemplate,它是对JDBC的简单封装
  2. JDBCTemplate类常用的操作
    1. update()
    2. query()
  3. 使用JDBCTemplate的流程
    1. 由Spring创建数据源(DataSource),即数据库连接池
      1. <!-- 注入DataSource(连接池) -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
                <property name="user" value="root"></property>
                <property name="password" value="root"></property>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mytest"></property>
                <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            </bean>
    2. 由Spring创建JDBCTemplate
      1. <!-- jdbc模板 -->
            <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource"></property>
            </bean>
    3. 自定义DAO,并注入JDBCTemplate,之后使用JDBCTemplate类方法(上述 ②)
  4. Spring中的事务分为两种
    1. 编程式事务
    2. 声明式事务
  5. 定义声明式事务的步骤
    1. 创建事务管理器和@Transaction注解驱动
    2. 给Service相应的方法加上@Transaction注解
  6. 总结一下注解
    1. 创建Bean:@Component,@Repository,@Service,@Controller
    2. 注入:@Autowired,@Resource,@Inject
    3. AspectJ:
      1. @Aspect
      2. @Before,@After,@Around,@AfterReturning,@AfterThrowing
    4. 事务:@Transactional
  7. 事务的四个特性:ACID
    1. 原子:事务包含的所有操作要么全部成功,要么全部失败回滚
    2. 一致:事务必须使数据库从一个一致性状态变换到另一个一致性状态
    3. 隔离:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰
      1. 不考虑隔离会产生的问题
        1. 脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据
        2. 不可重复读:在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了
        3. 虚读(幻读):针对一批数据,两次读期间被另一个事务增加了若干记录
      2. 隔离级别:级别越高,一致性越好,并发性越差
        1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
        2. Repeatable read (可重复读):可避免脏读、不可重复读的发生。
        3. Read committed (读已提交):可避免脏读的发生。
        4. Read uncommitted (读未提交):最低级别,任何情况都无法保证。
    4. 持久:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
  8. 事务的传播特性
    1. 当两个(或更多)事务方法合并到一起时,合并后的行为成为传播特性
    2. Spring中包括7种传播特性
    3. 事物的传播特性可以通过@Transactional的propagation属性来设置,例如:@Transactional(propagation=REQUIRED)
      1. REQUIRED:需要一个事务;有但合并,无则创建新事务
      2. REQUIRES_NEW:需要一个新事务;有则将外部事务挂起,并创建新事务,无则创建新事务
      3. SUPPORTS:支持事务,在一个事务内,合并;否则不支持事务(自动提交)
      4. NOT_SUPPORTS:不支持事务;无论是否放在事务方法中都不支持
      5. NEVER:不能放在事务方法中,否则抛出异常
      6. MANDATORY:必须放在事务中,否则抛出异常
      7. NESTED:内置事务;
        1. 如果没放在一个事务中,开启新事务;
        2. 如果放在一个事务中:
          1. 内部事务如果异常:外部可以捕获,并提交外部事务
          2. 外部事务如出异常:即使内部无异常,整个事务回退
  9. 设置回退事务属性
    1. 默认情况下,遇到RuntimeException及ERROR,事务回退;而出现Exception(受检查异常)则不会回退
    2. 可以通过rollbackFor,noRollbackFor来设置何种异常回退,何种异常提交(不回退)
  10. 设置事务的只读属性
    1. 对于不参与事务的读取操作,可使用read-only=true对数据访问做一些优化
  11. 超时
    1. timeout,时间单位是秒
    2. 当事务执行超时时自动回退

猜你喜欢

转载自blog.csdn.net/addkai/article/details/81213368
今日推荐