在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分。例如,一个转账操作:

-- 从id=1的账户给id=2的账户转账100元

-- 第一步:将id=1的A账户余额减去100

UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- 第二步:将id=2的B账户余额加上100

UPDATE accounts SET balance = balance + 100 WHERE id = 2;

这两条SQL语句必须全部执行,或者,由于某些原因,如果第一条语句成功,第二条语句失败,就必须全部撤销。

这种把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL一样,不会对数据库数据有任何改动。

可见,数据库事务具有ACID这4个特性:

A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;

C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;

I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;

D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。

对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。

要手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务,例如,把上述的转账操作作为一个显式事务:

BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;

UPDATE accounts SET balance = balance + 100 WHERE id = 2;

COMMIT;

很显然多条SQL语句要想作为一个事务执行,就必须使用显式事务。

COMMIT是指提交事务,即试图把事务内的所有SQL所做的修改永久保存。如果COMMIT语句执行失败了,整个事务也会失败。

有些时候,我们希望主动让事务失败,这时,可以用ROLLBACK回滚事务,整个事务会失败:

BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;

UPDATE accounts SET balance = balance + 100 WHERE id = 2;

ROLLBACK;

数据库事务是由数据库系统保证的,我们只需要根据业务逻辑使用它就可以。

隔离级别

对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。

SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:

Isolation Level脏读(Dirty Read)不可重复读(Non Repeatable Read)幻读(Phantom Read)

Read UncommittedYesYesYes

Read Committed-YesYes

Repeatable Read--Yes

Serializable---

我们会依次介绍4种隔离级别的数据一致性问题。

小结

数据库事务具有ACID特性,用来保证多条SQL的全部执行。

python提交事务_事务 - 廖雪峰的官方网站相关推荐

  1. python 惰性序列_讨论 - 廖雪峰的官方网站

    @廖雪峰 首先你要理解埃氏筛法的原理,其实是很简单的. 然后用惰性序列实现埃氏筛法时,只能想象抽象过程,不能推导每一步计算机是怎么算的,就像神经网络模拟的人工智能算法,连设计者也无法理解计算机执行的步 ...

  2. python怎么理解_讨论 - 廖雪峰的官方网站

    我的电脑是win7x64的系统 安装的是Python3.4.3 这是hello.py模块 !/usr/bin/env python3 -- coding: utf-8 -- 'just a test' ...

  3. python工作流程_讨论 - 廖雪峰的官方网站

    例: class test: def __init__(self): self.__name=None @myproperty def name(self): return self.__name @ ...

  4. python 廖雪峰_实战 - 廖雪峰的官方网站

    看完了教程,是不是有这么一种感觉:看的时候觉得很简单,照着教程敲代码也没啥大问题. 于是准备开始独立写代码,就发现不知道从哪开始下手了. 这种情况是完全正常的.好比学写作文,学的时候觉得简单,写的时候 ...

  5. python基础8(来自廖雪峰的官方网站)

    生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...

  6. python的本质,讨论 - 廖雪峰的官方网站

    关于 yield: yield一词的意思有 n.产出,产量:v.让步,提供. 所以当我们定义一个生成器函数时(带yield关键字的函数): def Iter(): for i in range(10) ...

  7. python3讨论交流地_讨论 - 廖雪峰的官方网站

    每个字都是经验所得,都是站在一个零基础的人的角度写的,纯手打+网上优秀资源整合,希望大家能每个字都认真看. 接下来文章会侧重在以下几方面 1.零基础如何进行人工智能的自学(以找工作为目的),包括路径规 ...

  8. python正确方法,方法 - 廖雪峰的官方网站

    在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们给xi ...

  9. python 廖雪峰_python学习(廖雪峰的官方网站)

    廖雪峰的官方网站. 请注意区分命令行模式和Python交互模式. 在命令行模式下,可以直接运行.py文件. 2运行其实和java运行一样 cd dir 3 print() input() 4数据类型 ...

最新文章

  1. 锁定计算机后等于睡眠吗,如何防止计算机自动进入睡眠和/或休眠状态?
  2. 四、“一场跨越时空持续数世纪的对话”
  3. 动态修改dom node的两种方法性能比较
  4. thunderbird html签名,Thunderbird中配置签名
  5. AsyncTask与多任务
  6. mac nginx映射ip和端口_步骤四、nginx反向代理
  7. CF1062E Company
  8. 针对不同包之间的action跳转,怎么配置?
  9. 电子工业出版社博文视点在2010年系统架构师大会上集锦
  10. Java 反射 面试题
  11. freemarker面试_SpringBoot基础面试题
  12. dev-c++文件名取名问题(踩坑)
  13. Axure RP9入门介绍----小白
  14. linux让grep带颜色,在linux下给grep命令添加颜色
  15. 重生之我是赏金猎人-SRC漏洞挖掘(一)-某SRC测试系统无脑Getshell
  16. hadoop生态圈详解
  17. html中视频代码字段,Html5通过数据流方式播放视频的实现
  18. 「集成架构」ETL工具大比拼:Talend vs Pentaho
  19. 在MFC中更改View类的基类CView为CScrollView的关键步骤
  20. 二. 滤波器件选型学习笔记

热门文章

  1. FlowJo 10.8.1 WIN版本丨英文 软件安装包下载 安装教程步骤丨WIN系统
  2. c# 窗体控件上绘制跟随鼠标的十字线
  3. u盘无法识别如何修复?恢复U盘,建议尝试下这些方法
  4. 甲骨文云上使用arm架构实例和对象存储搭建Harbor
  5. ZipException:invalid entry compressed size (expected 24709 but got 24714 bytes)
  6. 对cmake工程debug时出现错误 1: Syntax error: ( unexpected
  7. 小波从此逝,江海寄余生,不但是文坛巨擘还是不世出的编程奇才,王小波离世25周年
  8. printf函数的重定向
  9. C# WindowsForm 员工管理系统三【注册】
  10. android点击手机返回键触发事件