zoukankan      html  css  js  c++  java
  • Mysql 事务特性和隔离级别

     

    事务的特性

    • 原子性(Atomicity)
    一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    • 一致性(Consistency)
    在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
    • 隔离性(Isolation)
    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    • 持久性(Durability)
    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    事务的隔离级别和高并发 

    如果不考虑事务的隔离性,会发生的几种问题:

    • 脏读 (dirty read) :指在一个事务处理过程里读取了另一个未提交的事务中的数据。
    • 不可重复读 (unrepeated read):指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
    • 幻读(phantom read):一个事务执行两次查询,第二次查询比第一次多出或少一些数据,造成两次结果不一致。只是另一个事务在这两次查询中间插入或者 删除了数据造成的。
    • 第一类丢失更新(lost update): 在完全未隔离事务的情况下,两个事物更新同一条数据资源,某一事物异常终止,回滚造成第一个完成的更新也同时丢失 。
    • 第二类丢失更新(second lost updates):是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。

    四种事务隔离级别:

      1. Serializable 串行化
      2. Repeatable Read 可重复读
      3. Read Commited 可读已提交
      4. Read Uncommited 可读未提交

    并发控制:

    1. 数据库系统采用不同的锁类型来实现以上四种隔离级别,具体的实现过程对用户是透明的。用户关心的是如何选择隔离级别。
    2. 对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为 Read Committed,它能够避免脏读,而且具有较好的并发性能。
    3. 每个数据库连接都有一个全局变量 @@tx_isolation ,表示当前的事务隔离级别。JDBC 数据库连接使用数据库系统默认的隔离级别。
    4. 在 Hibernate 的配置文件中可以显示地设置隔离级别。每一种隔离级别对应着一个正整数。
    5. 需要注意的是,在受管理环境中,如果 Hibernate 使用的数据库连接来自于应用服务器提供的数据源,Hibernate不会改变这些连接的事务隔离级别。在这种情况下,应该通过修改应用服务器的数据源配置来修改隔离级别。
    6. 当数据库系统采用 Red Committed 隔离级别时,会导致不可重复读和第二类丢失更新的并发问题,在可能出现这种问题的场合。可以在应用程序中采用悲观锁或乐观锁来避免这类问题。

    mysql查看当前事务隔离级别:select @@tx_isolation


    设置事务隔离级别:set [glogal | session] transaction isolation level 隔离级别名称;set tx_isolation=’隔离级别名称;’

      

  • 相关阅读:
    js将图片转换为base64
    java 后台将base64字符串保存为图片
    mysql truncate drop delete的区别
    java的反射机制
    mysql的三大范式
    EasyUi datagrid鼠标的悬停效果
    SimpleDateFormat关于时间类的一些常用处理
    mysql修改表字段属性类型
    Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")
    tomcat如何修改发布目录
  • 原文地址:https://www.cnblogs.com/starfish29/p/12492237.html
Copyright © 2011-2022 走看看