MySQL之事务

一 数据库事务

  指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

  通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

ACID:

1. 原子性(atomicity)

  一个事务必须被视为一个 不可分割的最小工作单元。这个事务中的所有操作要么全部执行成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

 

2. 一致性(consistency)

 数据库总是从一个 一致性的状态转换到另外一个一致性的状态。因为事务最终没有提交,所以事务中所作的修改也不会保存到数据库中。

 

3. 隔离性(isolation)

 通常来说,一个事务所作的修改在最终提交以前,对其他事务是不可见的。后面隔离级别(Isolation level),提起为何要说“通常来说”是不可见的。

 

4. 持久性(durability)

  一旦事务提交,则其所作的修改就会永久保存到数据库中。此时即使系统奔溃,修改的数据也不会丢失。持久性是个模糊的概念,因为实际上持久性也分很多不同的级别,有些持久性策略能够提供非常强的安全保障,而有些则未必。           

    

二 简单实现方式


#两种方式

1.选择数据库引擎:InnoDB
2.通过代码,实现


1. InnoDB

CREATE TABLE shoop(
id int PRIMARY KEY auto_increment,
name VARCHAR(20),
price date,
class varchar(10)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


2. 通过代码

def tran(request):
 
    from django.db import transaction  #导入模块
 
    try:
        with transaction.atomic():
            models.UserProfile.objects.create(name='Tom',email='ertywer@.com',
                                              phone='123456',mobile='136126')
            models.Server.objects.create(hostname='c33.com',sn='EEC DC HF')
    except Exception as e:
        return HttpResponse('出现错误')
 
    return HttpResponse('执行成功')

 

三 隔离级别

    SQL标准规定,四种隔离级别,每一种级别都规定了一个事务中所作的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离性通常可执行更高的并发,系统的开销也更低。   

 

四种隔离级别:

READ UNCOMMITTED(未提交读)
        事务可以提交未提交的数据,称为脏读。
        很少使用

READ COMMITTED(提交读) 大多数据系统的默认隔离级别都是READ COMMITTED(但MySQL不是)。 一个事务从开始时,所做的任何修改对其他事务都是不可见的,这个级别有时称作:
不可重复读(nonrepeatable read),因为两次执行同样的查询,可能得到不一样的结果
REPEATABLE READ (可重复读) !!! 解决了脏读的问题。 该级别保证了 在同一个事务中多次读取同样记录的结果是一致的。 但理论上,可重复读还是解决另外一个幻读(Phantom Read)的问题。 幻读: 当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB
和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。 可重复读 是MySQL的默认事务隔离级别。
SERIALIZABLE(可串行化) SERIALIZABLE 是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。 简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。 只有在非常需要确保数据的一直性而且可接受没有并发的情况下,才考虑此。

 

 

 

  

posted @ 2018-05-10 12:50  shadow3  阅读(109)  评论(0)    收藏  举报