精华内容
下载资源
问答
  • 数据库事物的四大特性转自:http://www.cnblogs.com/fjdingsd/p/5273008.html目录用 [TOC]来生成目录:数据库事物的四大特性 目录 1脏读 2不可重复读 3虚读幻读 四种隔离级别本篇讲诉数据库中事务的四大特性(ACID)...

    数据库事物的四大特性

    转自:http://www.cnblogs.com/fjdingsd/p/5273008.html

    目录

    [TOC]来生成目录:

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

    • 原子性(Atomicity)

         原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
      
    • 一致性(Consistency)

         一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
         拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性
      
    • 隔离性(Isolation)

         隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
          即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
      
    • 持久性(Durability)

           持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
           例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误
      

    以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

    1,脏读

    脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
     当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

    update account set money=money+100 where name=’B’;  (此时A通知B)
    update account set money=money - 100 where name=’A’;

    当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

    2,不可重复读

    不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

      例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

      不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

      在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

    3,虚读(幻读)

    幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

      幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
      

    四种隔离级别

    隔离级别 内容
    Serializable (串行化) 可避免脏读、不可重复读、幻读的发生。
    Repeatable read (可重复读) 可避免脏读、不可重复读的发生。
    Read committed (读已提交) 可避免脏读的发生。
    Read uncommitted (读未提交) 最低级别,任何情况都无法保证。

    以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

      在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

    以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

      在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

      在MySQL数据库中查看当前事务的隔离级别:

     select @@tx_isolation;

      在MySQL数据库中设置事务的隔离 级别:

     set  [glogal | session]  transaction isolation level 隔离级别名称;
        set tx_isolation=’隔离级别名称;

    例1:查看当前事务的隔离级别:
    这里写图片描述

    记住:设置数据库的隔离级别一定要是在开启事务之前!

      如果是使用JDBC对数据库的事务设置隔离级别的话,也应该是在调用Connection对象的setAutoCommit(false)方法之前。调用Connection对象的setTransactionIsolation(level)即可设置当前链接的隔离级别,至于参数level,可以使用Connection对象的字段:

      后记:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

    展开全文
  • 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。  如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity)  原子性是指事务包含的所有...

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。

      如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

    ⑴ 原子性(Atomicity)

      原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    ⑵ 一致性(Consistency)

      一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

      拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

    ⑶ 隔离性(Isolation)

      隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

      即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

      关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

    ⑷ 持久性(Durability)

      持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

      例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

      

      以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

    1,脏读

      脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

      当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

        update account set money=money+100 where name=’B’;  (此时A通知B)
    
        update account set money=money - 100 where name=’A’;

      当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

    2,不可重复读

      不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

      例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

      不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

      在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

    3,虚读(幻读)

      幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

      幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

     

      现在来看看MySQL数据库为我们提供的四种隔离级别:

      ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

      ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

      ③ Read committed (读已提交):可避免脏读的发生。

      ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

     

      以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

      在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

    展开全文
  • 数据库事务的四大特性(简称ACID)是:  (1) 原子性(Atomicity) 事务的原子性指的是,事务包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。...

    数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。

    数据库事务的四大特性(简称ACID)是: 

    (1) 原子性(Atomicity)

    事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。

    例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。

    (2)一致性(Consistency)    

    事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。

    例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。

    (3)分离性(亦称独立性Isolation)

    分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。

    (4)持久性(Durability)

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

    展开全文
  • 事务的四大特性(ACID) 并发访问会导致的问题 事务的隔离级别 mysql 如何实现repeatable read 的? MVCC 具体实现分析: 参考博文: https://www.cnblogs.com/luchangyou/p/11321607.html 事务的四大特性...

    目录

    事务的四大特性(ACID)

    并发访问会导致的问题

    事务的隔离级别

    mysql 如何实现 repeatable read 的?

    MVCC 具体实现分析:

     参考博文:

    https://www.cnblogs.com/luchangyou/p/11321607.html


    事务的四大特性(ACID)

    1、原子性(Atomicity):原子性是指事务的不可分割,要么全部执行成功,要么全部失败,是一次完整的操作。

    2、一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

    3、隔离性(Isolation): 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

    4、持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    并发访问会导致的问题

    如果不考虑隔离级别,事务会存在3种并发问题:

    1)脏读:B事务读取到了A事务尚未提交的数据   ------  要求B事务要读取A事务提交的数据

    2)不可重复读:一个事务中两次读取的数据的内容不一致  ----- 要求的是一个事务中多次读取时数据是一致的  --- unpdate

    3)幻读/虚读:一个事务中两次读取的数据的数量不一致  ----- 要求在一个事务多次读取的数据的数量是一致的 --insert  delete

    事务的隔离级别

    1)read uncommitted : 读取尚未提交的数据 -> 哪个问题都不能解决

    2)read committed:读取已经提交的数据 -> 可以解决脏读 ---- oracle、sql server、postgresql 默认的

    3)repeatable read:重读读取 -> 可以解决脏读和不可重复读 ---mysql默认的

    4)serializable:串行化 -> 可以解决脏读不可重复读和虚读---相当于锁表

    mysql 如何实现 repeatable read 的?

    通过MVCC机制+行锁,MVCC机制即多版本并发控制(multi-version concurrency control)。

    通过保存数据在某个时间点的快照来实现的。不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制。当我们创建表完成后,mysql会自动为每个表添加数据版本号(最后更新数据的事务id)db_trx_id 删除版本号 db_roll_pt (数据删除的事务id) 事务id由mysql数据库自动生成且递增,这两列内容是隐藏列

    MVCC 具体实现分析:

    1. MVCC逻辑流程-插入(insert)

    start transaction;(事务id为1)
    INSERT INTO user (name,sex) VALUES ('张三','男');
    INSERT INTO user (name,sex) VALUES ('李四','男');
    commit;

    数据中对应表如下:

    id name  sex db_trx_id db_roll_pt
    1 张三 1 null
    2 李四 1 null

     

     

     

     

    2. MVCC逻辑流程-查询(select)

    查询时需要同时满足以下两个条件:
      1、查找数据版本号,早于(小于等于)当前事务id的数据行。 这样可以确保事务读取的数据是事务之前已经存在的。或者是当前事务插入或修改的。
      2、查找删除版本号为 null 或者大于当前事务版本号的记录。 这样确保取出来的数据在当前事务开启之前没有被删除。

    如下图,假如有一个事务中执行查询(假设事务id=2)

    start transaction;(事务id为2)
    select * from user where sex = '男';

    当刚创建完事务2,即将执行查询sql,

    此时另一个事务 id=3 ,对表 user 进行插入:INSERT INTO user (name,sex) VALUES ('王五','男');并提交事务。数据中对应表如下:

    id name  sex db_trx_id db_roll_pt
    1 张三 1 null
    2 李四 1 null
    3 王五 3 null

     

     

     

      

     

    事务id=2,查询的结果是两条数据,因为 id=2 要找小于等于2 的事务,并且删除版本号都为null。

    3. MVCC逻辑流程-删除(delete)

    标记删除,不是实际删除。

    假如有一个事务中执行查询(假设事务id=4),

    start transaction;(事务id为4)
    select * from user where sex = '男';

    此时另一个事务 id=5 ,对表 user 进行删除:DELETE FROM user WHERE id = 1;并提交事务。数据中对应表如下:

    id name  sex db_trx_id db_roll_pt
    1 张三 1 5
    2 李四 1 null
    3 王五 3

    null

     

     

     

     

     

     事务id=4,查询的结果是3条数据,因为 id=4 要找小于等于4 的事务,并且删除版本号都为null或大于id=4。

    4. MVCC逻辑流程-修改(update)

    当一个事务修改一条记录时, 要先复制该数据,新数据数据版本号为当前事务id,删除版本号为 null 。然后更新原来数据的删除版本号为当前事务id。如下:

    假如一个事务 id=6 执行了一条update语句:UPDATE user SET name='李四2'  WHERE id = 2;并提交事务。数据中对应表如下:

    id name  sex db_trx_id db_roll_pt
    1 张三 1 5
    2 李四 1 6(复制数据到此表空间中
    3 王五 3

    null

    4 李四2 6 null

     

     

     

     

     

     

    事务id=4,查询的结果是3条数据,

     

    mvcc 优缺点:

    优点:在读取数据时,innodb几乎不用获取任何锁,在每个查询通过版本检查,只获取需要的数据版本,提高系统并发度;

    缺点:为了实现多版本,innodb必须对每行增加相应字段来存储版本信息,同时需要维护每一行的版本信息,而且在检索行的时候,需要进行版本的比较,因而减低了查询效率;innodb还需要定期清理不再需要的行版本,及时回收空间,这也增加开销;

     参考博文:

    https://www.cnblogs.com/luchangyou/p/11321607.html

    展开全文
  • 原子性(Atomicity):化学中原子指不可再分基本微粒,数据库中原子性强调事务是一个不可分割整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错就会...
  • 数据库事物的四个基本性质(ACID)1.原子性(Atomicity)指的是事物包含的所有操作要么全做,要么全不做(all or none)。2.一致性(consistency)在事物开始以前,数据库处于一致性的状态,事物结束后,...
  • 1.事物的ACID特性 原子性 事物的原子性是指事物必须是一个原子的操作序列单元。事物包含的各项操作在一次执行过程,只允许出现两种状态之一。 全部执行成功 全部执行失败 任何一个异常的操作,都会使目前...
  • 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备四个特性。 事物具有四个隔离级别。
  • ACDI事物的四大特性

    2019-06-11 15:13:18
    ACDI事物的四大特性 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生。 比如:转账转过去的加和转时候的减必须一次发生 一致性(Consistency) 事务必须使...
  • 事物的四大特性

    2019-11-29 21:15:40
    原子性:事务中的数据要么全部执行,要么全都不执行,是不可分割工作单位 一致性:事物前后台数据完整性必须保持一致 隔离性:是指多个用户并发访问数据库时,一个用户事务不能被其他用户的事物所干扰,多个并发事务...
  • 1 什么是事物   定义: 事物就是数据库执行过程的一个逻辑单位,由一个有限的数据库...2 事物的四大特性 2.1 原子性(Atomicity)   原子性就是将事物进行的操作捆绑成一个不可分割的单元,事物进行的数据操...
  • 数据库事物的4大特性

    2013-08-09 10:49:30
    数据库事务四大特性是什么? 事务:原子性、一致性、分离性、持久性 (1) 原子性 事务原子性指是,事务包含程序作为数据库的逻辑工作单位,它所做对数据修改操作要么全部执行,要么完全不执行。这种...
  • 事物的四大特性与隔离级别

    千次阅读 2017-08-06 19:51:39
    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。  如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity)  原子性是指事务包含的所有...
  • 1:数据库中事务的四大特性(ACID)⑴ 原子性(Atomicity) 原子性是指事务的不可分割,原子是物理上最小的单位,不能再做分割,事物也是一样不能被分割开来;要么全部执行成功,要么全部失败,是一次完整的操作,...
  • 数据库事物4个特性

    2018-12-03 14:24:00
    数据库事务是数据库运行的...数据库事务的四大特性(ACID): (1) 原子性(Atomicity): 事务的原子性指的是,事务包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这...
  • 数据库中的事物

    2017-12-21 21:02:29
    一、什么是事物访问并可能更新数据库中各种数据项的一个程序执行单元二、事物的作用用于保证数据的一致性三、事物的四大特性原子性:事物中的一系列步骤要么都执行,要么都不执行一致性:事物执行前后,数据库中的...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

数据库中事物的四大特性