这篇文章给大家简单介绍一下数据库编程中的事务的概念,那么什么是事务呢?简单的说事务就是应用程序中的一系列逻辑相关的操作,当逻辑上的某些操作全部执行成功后,才认为这个逻辑被正确的完成,否则在这之前的操作需要被撤销,一个事务中的一系列操作要么全部成功,要么全部撤销;
举一个简单例子,如果一所学校需要统计某个年级的成绩,那么该年级需要统计各个班级的成绩,只有获取到每个班级的成绩后,年级才可以上报给学校,倘如其中一个班级的成绩没有获取到,那么提交给学校的操作就无法执行,需要重新获取。
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持久性( Durability )。这四个特性简称为 ACID 特性。
1 、原子性事务是数据库的逻辑工作单位,不可分割,事务中包含的各操作要么都做,要么都不做
2 、一致性事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,不能回滚。接下来的其它操作或故障不应该对其执行结果有任何影响。
接下来分别在PHP和python的代码中对事务进行简单的分析
代码例子就以银行账户为例,比如A用户向B用户汇款,那么A用户汇款后,B用户收到汇款后这个逻辑操作才算真的意义的成功,倘如A汇了钱,但是B却没收到,可是A账户却扣了钱,还有一种就是A汇了钱,B收到了,可是A账户却没有扣钱,这是不是很尴尬,所以,类似这种情况的操作都需要事件的介入;
首先建立数据库,简单的就两个字段,用户ID 和 该用户的银行账户存款数额,数据表如下:
下面直接上代码了:
PHP代码如下
$mysqli=new mysqli("127.0.0.1","root","","demo");
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
$mysqli->query("set names utf8");
$mysqli->autocommit(false);//将提交设置为false
$sql1="update account set balance=balance-10 where id=100";
$sql2="update account set balance=balance+10 where id=101";
$a=$mysqli->query($sql1);
$b=$mysqli->query($sql2);
if(!$a || !$b){
echo "失败,回滚".$mysqli->error;
$mysqli->rollback();//回滚,相当于返回到操作前的状态
}else{
echo "成功,提交";
$mysqli->commit();//提交,提交后是无法会回滚的
}
$mysqli->close();
PHP中需要设置$mysqli->autocommit(false);如果为true,那么会执行自动提交,即无法保证操作全部执行成功,所以设置为flase,在操作全部执行成功后进行commit操作。
python代码如下:
#coding=utf-8
from pymysql import *
def main():
try:
conn = connect(host="127.0.0.1",port=3306,user="root",password="",database="demo",charset="utf8")
cur = conn.cursor()
sql1 = "update account set balance=balance-10 where id=100;"
sql2 = "update account set balance=balance+10 where id=101;"
count1 = cur.execute(sql1)
count2 = cur.execute(sql2)
if count1 == 1 and count2 == 1:
conn.commit()
print("成功")
cur.close()
except Exception as e:
print(e)
finally:
conn.close()
if __name__ == '__main__':
main()
python的操作默认是不自动提交的,cur.execute()返回为1时即成功,继而进行commit提交操作,完成整个逻辑操作流程。