事务
事务是一个最小的执行单元。通常一个事务对应一个完整的业务,多个操作同时进行,要么同时成功,要么同时失败,就是事务。一个完整的业务需要批量的DML(数据操纵语言,指数据库增删改)语句共同联合完成。事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
事务特性
原子性
事务是一个不可分割的工作单位,要么同时成功,要么同时失败,这便是原子性。例如:当两个人发起转账业务时,如果A发起转账,而B因为一些原因不能成功接收,事务就会判为失败,也就是不会提交,A和B的转账也不会成功。
如何保证原子性?
对于A和B两操作要操作成功就一定需要更改到表的信息,如果A语句操作成功,而B语句因为一些原因终止操作了,所以事务没有成功,在没有提交事务之前,mysql会先将更新前的数据更新到undo log日志里面,因为事务没有成功而发生事务回滚时,会从undo log日志里面先前存好的数据,重新对数据库的数据进行数据的回退。
undo log日志:撤销回退的日志,主要存储数据库更新之前的数据,用于作备份
持久性
事务提交后,就是永久改变数据库数据。只要提交了事务,将会对数据库的数据进行永久性刷新
如何保证事务的持久性?
通过重做日志:redo log日志,将用户发生修改而未提交的数据存入redo log日志中,当发生断电等其他异常时,可以根据redo log日志重新对数据做一个提交,做一个恢复。
隔离性
事务与事务之间相互隔离,互不干扰。数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
python应用方法
#! /use/bin/python
# -*- coding:UTF-8 -*-
import pymysql
# 创建连接
conn=pymysql.connect(host='127.0.0.1',port=3306,user='xxxx',passwd='xxxxx',db='xxxxx',charset='utf8')
#创建游标
cursor = conn.cursor()
try:
# 执行sql语句
cursor.execute("update account set money=money-600 where name='zhangsan'")
cursor.execute("update account set money=money+600 where name='lisi'")
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚 回滚到获取游标的位置开始重新执行 看代码上面的文字有说明
db.rollback()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
标签:语句,事务,log,数据库,提交,mysql,日志
From: https://www.cnblogs.com/jianghao000/p/16969150.html