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会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。
只有在非常需要确保数据的一直性而且可接受没有并发的情况下,才考虑此。

浙公网安备 33010602011771号