• 数据库的事务


    数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

    数据库的四大特点:

    (1)原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

    (2)一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账户金额之和在事务前后应该是保持不变的。

    (3)隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据

    (4)持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

    在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。因为底层在执行SQL语句之前会自动开启事务,在SQL语句执行完后,会立即结束事务!

    如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务。

    • 开启事务:start transaction;

    • 结束事务:commit(提交事务)或 rollback(回滚事务)。

    事物的并发:

    多个事务对相同的数据同时进行操作,这叫做事务并发。

    在事务并发时,如果没有采取必要的隔离措施,可能会导致各种并发问题,破坏数据的完整性等。这些问题中,其中有三类是读问题,分别是:脏读、不可重复读、幻读。

    (1)脏读(dirty read):在一个事务中,读取到另一个事务未提交更新的数据,即读取到了脏数据;

    例如:A给B转账100元但未提交事务,在B查询后,A做了回滚操作,那么B查询到了A未提交的数据,就称之为脏读。

    (2)不可重复读(unrepeatable read):对同一记录的两次读取结果不一致,因为在两次查询期间,有另一事务对该记录做了修改(是针对修改操作)

    例如:在事务1中,前后两次查询A账户的金额,在两次查询之间,另一事物2对A账户的金额做了修改(并且也提交了事务),此种情况可能会导致事务1中,前后两次查询的结果不一致。这就是不可重复读。

    (3)幻读(虚读)(phantom read):对同一张表的两次查询结果不一致,因为在两次查询期间,有另一事务进行了插入或者是删除操作(是针对插入或删除操作);

     

    事物的隔离级别:

    1、READ UNCOMMITTED(读未提交数据)

    安全性最差,可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)

    但性能最好(不使用!!)

    2、READ COMMITTED(读已提交数据)(Oracle默认)

    安全性较差

    性能较好

    可以防止脏读,但不能防止不可重复读,也不能防止幻读;

    3、REPEATABLE READ(可重复读)(MySQL默认)

    安全性较高

    性能较差

    可以防止脏读不可重复读,但不能防止幻读问题;

    4、SERIALIZABLE(串行化)

    安全性最高,不会出现任何并发问题,因为它对同一数据的访问是串行的,非并发访问;

    性能最差;(不使用!!)

    MySQL的默认隔离级别为REPEATABLE READ,即可以防止脏读和不可重复读

     

     

     

  • 相关阅读:
    【Codeforces Round#279 Div.2】B. Queue
    210
    回溯
    HuffmanTree && HuffmanCode
    (转)STL
    2013 ACM/ICPC 长沙现场赛 A题
    不是数据库中的列,而是查询结果集中的列
    又出现新问题,所以又发现了之前的一些问题 (关于修改表单地址,要不要改回来的问题) 原因已经解决
    MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案
    为什么突然 选择删除的按钮失效???
  • 原文地址:https://www.cnblogs.com/zzm0619/p/13200256.html
Copyright © 2020-2023  润新知