zoukankan      html  css  js  c++  java
  • 19.10.11学习日记随笔 mysql事务隔离性

    一天的感悟

    学习事务的处理方式,其中反想自己学过的flask 默认是开启事务的,flask_sqlalchemy每次在提交时都是需要commit,或者失败是需要rollback回滚操作的,其实python方面就不需要进行操作了,django的orm 不过需要导入事务处理的包,使用上下文with方式,当出现异常就会尝试回滚rollback 

    (jdbc)

    在说java,使用spring的核心ioc与aop也是很容易配置事务开启的, public方法先是读取配置文件properties文件的数据库uri(用注解@value("${在配置文件中的key}"))返回数据库连接对象         注解扫描配置文件  记得在xml文件中添加<bean:context_scan (?? 应该是这么写的..忘记了) class="xxxx.xxxx.xxx">, 开启扫描模式 扫描使用注解的类和方法   

    <!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 -->
      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
        destroy-method="close"
        driverClass="com.mysql.jdbc.Driver"
        jdbcUrl="jdbc:mysql://localhost/test"
        user="root"
        password=""
        maxPoolSize="40"
        minPoolSize="2"
        initialPoolSize="2"
        maxIdleTime="30" />
      <!-- 配置JDBC数据源的局部数据管理器,使用DataSourceTransactionManager类 -->
      <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        dataSource-ref="dataSource" />

    之后配置事务管理器,不管xml还是注解配置 ,基本都是一个transaction实例对象,其中实例对象需要datarouser的数据库连接对象connection属性 

    如果是设置aop切片方式则需要在xml文件中设置那些需要事务操作,一般都是dao文件中的对数据库的操作,但是还是区分一下select和其他操作的区别对待就好了

    <tx:advice id="txAdvice"
        transaction-manager="transactionManager">
        <!-- 用于配置详细的事务定义 -->
        <tx:attributes>
          <!-- 所有以get开头的方法都是只读的 -->
          <tx:method name="get*" read-only="true" />
          <!-- 其他方法默认都适用事务,指定超时5秒 -->
          <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5" />
        </tx:attributes>
      </tx:advice>
      <aoconfig>
        <!-- 配置一个切入点,匹配impl包下所有以impl结尾的类里的所有方法的执行 -->
        <aopointcut expression="execution(* com.dao.impl.*Impl.*(..))" id="myPointcut" />
        <!-- 将切入点myPointcut和增强txAdvice绑定-->
        <aoadvisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
        <!-- 再配置一个切入点,匹配impl包下所有以abc开头类里的所有方法的执行 -->
      </aoconfig>

    在来就是注解操作了,需要在实现增删改的方法上添加注解   ,不过注意 如果优化性能需要进行数据隔离新的配置,还有超时

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, timeout=5)

    当然还有全局jat事务操作,锁定多个行,不让其他操作进行事务处理   感觉用的不多

    在xml中声明的实例如下

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
      jndiName="jdbc/jpetstore" />
    <!-- 使用JtaTransactionManager类, 该类实现了PlatformTransactionManager接口 -->
    <!-- 使用JTA全局事务,Spring容器可以自行从Java EE服务器中获取事务性资源,无需依赖注入 -->
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

    其他操作基本和jdbc的差不多 

    还是golang的gorm,默认是没有开启事务的,不过可以对其中进行设置,先前条件是有gorm.db对象存在

    // 开启transaction事务
    tx := db.begin()
    
    // 执行逻辑,假设使用方法将事务句柄和操作数据传递进去返回err判断
    if err := 方法名(tx,数据);err!=nil{
         tx.rollback()    
    }
    // 如果返回nil
    tx.commit;

    基本就是这个操作

    但是注意 开启事务之后如果增删改 对锁表的操作很频繁需要注意 很有可能是没有设置索引而导致的,因为innodb引擎默认是支持行锁事务处理的,但是增删改查做限制的条件不是索引,那么会在一张表中从上到下,一次根据查询where的条件操作并锁住不放开,如果数据在最后一个,那么从第一个数据开始会慢慢把整张表锁住,所以注意index在进行增删改查时很重要,对性能优化很大提升,

    但也不是什么列都能进行索引设置的,一般对不经常修改的列,表中数据超多的列设置索引,不对经常变动的列设置索引,为啥不支持?因为索引的原理时和红黑二叉树差不多的操作,其中

    保持左右两边平衡,如果一个数据时常修改那么索引就要不断对该数据列进行平衡,会耗费资源很多,还有也是占用硬盘空间,                 

    主键不能当作索引来使用,不要以为是索引的一种就能当作索引来操作了,不能作为索引

    还有事务操作过程中 四大原理  

    原子性

    一致性

    隔离性

    持久性

    1.原子性就是 把本来多个藕断丝连的sql操作当作一个sql来操作

     2.一致性可以接上面的原子性  ,如果原子性质的一个sql语句执行出现问题就会rollback回滚 ,要么好,要么坏

    3.隔离性 则是事务接管sql语句执行过程中给与其他事务的权限,  其中含有 等级低到高 需要时间越长

      Read Uncommitted  能读取还没有commit提交的数据 (最好不要使用)  术语属于脏读

      Read committed 能读取到事务提交的数据   但是如果a事务在select * 时 ,b事务commit了, 那么a事务再次select * 会读取到不同的数据  解决上面的脏读,但是出现不能每次读取一样的数据  术语属于不可重复读

      Repeated Read: 在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交  解决脏读和不可重复度,但出现幻读(两个不同的事务操作在时间上的不一致导致查询的数据与对比不同)

      Serialization     阻塞式的事务操作,只有一个事务操作完成之后才能让其他事务操作,(mysql引擎innodb默认支持锁行事务,所以这个用在银行转账比敏感的操作,不过效率不高)

      一般情况 第二种和第三种都是能接受的加锁事务处理,但是设置到钱的敏感还是 最后一中串行阻塞的最好(因该?)

    4.持久性  保存在服务器硬盘中,如果一旦commit持久化了,那么不能rollback回滚了

    学习url  

    https://www.jb51.net/article/134677.htm

    https://blog.csdn.net/qq_38362127/article/details/78130751

    https://www.bilibili.com/video/av60556933?p=6

  • 相关阅读:
    Linux下查找大文件以及目录
    Linux 下定时备份数据库以及删除缓存
    java中main方法的 (String []args)
    RabbitMQ消息队列(二):”Hello, World“
    maven 多模块项目
    java 接口的作用和好处
    Centos下使用压缩包安装MySQL5.7
    修复mysql:[ERROR] Native table ‘performance_schema’
    连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
    centos6下无法使用lsof命令"-bash: lsof: command not found"
  • 原文地址:https://www.cnblogs.com/zengxm/p/11651719.html
Copyright © 2011-2022 走看看