php 事务处理transaction

Posted 瑛雄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 事务处理transaction相关的知识,希望对你有一定的参考价值。

mysql 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务

  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

  • 事务用来管理insert,update,delete语句

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(持久性)

  • 1、事务的原子性:一组事务,要么成功;要么撤回。

  • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。

  • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

  • 4、持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久的,接下来即使数据库发生故障也不应该对其有任何影响。

 

执行下面的程序

技术图片
$mysqli = new mysqli(‘localhost‘,‘root‘,‘mayi1991‘,‘mysqldemo‘);
if($mysqli->connect_error){
    die(‘数据库连接错误‘.$mysqli->connect_error);
}

$sql1 = "update account set balance = balance - 2 where id = 1";
//这里故意写错指令中的balance1属性
$sql2 = "update account set balance1 = balance + 2 where id = 2";        
$result1 = $mysqli->query($sql1);
$result2 = $mysqli->query($sql2);

if(!$result1 || !$result2){
    die(‘操作错误‘.$mysqli->error);
}else{
    die(‘操作成功‘);
}
$mysqli->close();
技术图片

虽然上面的代码有报错,但是在数据库中,id=1的balance已经改变;这样就会出现问题;

我们要的同时改变,如果有一个出错,就不改变;这个时候,我们就需要“事务控制”来保证“一致性”;

 

我们需要用到的方法autocommit()  commit();看下面的代码

技术图片
$mysqli = new mysqli(‘localhost‘,‘root‘,‘mayi1991‘,‘mysqldemo‘);
if($mysqli->connect_error){
    die(‘数据库连接错误‘.$mysqli->connect_error);
}

//关闭数据库自动提交
$mysqli->autocommit(false);

$sql1 = "update account set balance = balance - 2 where id = 1";
//这里故意写错属性balance1
$sql2 = "update account set balance1 = balance + 2 where id = 2";
$result1 = $mysqli->query($sql1);
$result2 = $mysqli->query($sql2);

if(!$result1 || !$result2){
    die(‘操作错误‘.$mysqli->error);
    $mysqli->rollback();    //事务回退
}else{
    //操作全部正确后再提交
    $mysqli->commit();
}
$mysqli->close();
技术图片

首先利用autocommit(false)方法,关闭数据库自动提交,然后当操作语句全部成功后,commit()提交到数据库;

如果操作失败,我们用rollback()方法回退。

以上是关于php 事务处理transaction的主要内容,如果未能解决你的问题,请参考以下文章

@Transactional(事务讲解)和springboot 整合事务

SpringBoot设置 @Transactional ,并在异常处理中调用setRollbackOnly()事务不回滚

Spring 事务注解@Transactional

聊聊Spring事务控制策略以及@Transactional失效问题避坑

@Transactional的使用

[转]oracle中使用set transaction设置事务属性