zoukankan      html  css  js  c++  java
  • 【面试题】并发操作时数据库事务怎么处理的

    事务(transaction)是由一些列操作序列构成的执行单元,这些单元要么都做,要么不做,是一个不可分割的工作单元。

    事务的四种特性:原子性、一致性、分离性、持久性。

    原子性:指的是事物中包含的所有操作要么全做,要么全不做。

    一致性:在事物开始以前,数据库处于一致性的状态,事物结束后,数据库也必须处于一致性的状态。

    分离性:指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。

    持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。

    事务处理有两种:1.数据库事务   2.Spring事务(我们一般都用Spring处理事务)

    数据库事务级别有3中:分别是幻读、不可重复读和脏读

    幻读(读取时,插入):事务T1进行查询操作返回了一个结果集,事务T2此时进行了insert操作,恰好满足事务T1的要求,此时T1并查询一遍,返回的结果集和第一次返回的结果集不同。

    不可重复读(读取时,有更新):事务T1进行查询操作返回了一个结果集,事务T2此时进行了update操作,事务T1再查询一遍,两个返回的结果集不一致。

    脏读(更新后读取):事务T1进行了insert/update操作,未提交。事务T2进行查询返回了一个结果集,此时T1进行了回滚,T2读到的其实就是无效的脏数据了。

    数据库事务隔离级别有以下四种:

    READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。

    READ COMMITTED 允许幻想读、不可重复读,不允许脏读

    REPEATABLE READ 允许幻想读,不允许不可重复读和脏读

    SERIALIZABLE 幻想读、不可重复读和脏读都不允许

    OracleOracle不支持脏读,所以数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。

    SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED,MySql的默认可重复读取(REPEATABLE READ);

    设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

  • 相关阅读:
    java课堂作业(四)
    java听课笔记(五)
    rsync 无密码传输文件
    HTTP返回码总结 (zz)
    打印1到最大的n位数
    两个栈模拟队列
    合并有序数组
    vim MiniBufExplorer 插件
    crontab 定时任务格式
    JNI调用测试
  • 原文地址:https://www.cnblogs.com/lucky-girl/p/8818991.html
Copyright © 2011-2022 走看看