Spring学习(三)

SpringJDBC

步骤:
1.在原先的spring包加入spring-jdbc的包
这里写图片描述

2.修改spring配置文件

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb"/>
    <property name="username" value="root"/>
    <property name="password" value="1234"/>
    <!-- 数据连接池中启动的初始值 -->
    <property name="initialSize" value="1"></property>
    <!-- 数据连接池中最大的连接数-->
    <property name="maxActive" value="500"></property>
    <!-- 数据连接池最大空闲连接数 -->
    <property name="maxIdle" value="2"></property>
    <!-- 数据连接池最小空闲连接数 -->
     <property name="minIdle" value="1"></property>
  </bean>

<!-- 注入spring JDBC 官方工具包 -->
<bean id="jdbc"  class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>

destroy-method=”close”:设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能正常关闭;销毁方法调用close(),是将连接关闭,并不是真正的把资源销毁。

3.在dao层中采用注入方式注入JDBCTemplate

 @Resource(name = "jdbc")
    private JdbcTemplate util;

spring注解事务实现步骤

1.在spring配置文件指明实现事务

<!-- 配置事务的bean -->
    <bean id="dstmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 指定实现事务的bean -->
    <tx:annotation-driven transaction-manager="dstmanager"></tx:annotation-driven>

2.在需要使用事务的类或者方法上采用@Transactional
如果在方法上注解事务,那么只有该方法使用事务,即该方法内的数据访问操作都是在同一个事务中。
如果是注解在类上面的,那么表示该类下面的每个方法都是实现事务的,每个方法自己内部的数据访问一句都是在同一个事务中。
@Transactional(timeout=30) :默认是30秒,超过自动回滚
@Transactional(isolation = Isolation.READ_UNCOMMITTED):设置事务隔离级别

事务隔离级别
数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。大多数据库默认的隔离级别为Read Commited,如SqlServer,当然也有少部分数据库默认的隔离级别为Repeatable Read ,如Mysql

  • Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。
  • Read Commited:读已提交数据(会出现不可重复读和幻读)
  • Repeatable Read:可重复读(会出现幻读)
  • Serializable:串行化

脏读:一个事务读取到另一事务未提交的更新新据。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:一个事务读取到另一事务已提交的insert数据。

猜你喜欢

转载自blog.csdn.net/qq_41372922/article/details/82657506