1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
// 事务: 将 多条sql语句绑定为一个整体, 其中有任意一条sql 失败, 则整体失败. // // MyISAM 不支持事务
// InnoDB 支持事务
// 自动提交: // 默认情况下, sql一旦执行, 就会立马改变sql的状态 // 关闭自动提交, sql一旦执行, 能得到sql的状态结果, 但是sql不会真正的改变
try { $pdo = new PDO('mysql:host=localhost;dbname=s86;charset=utf8','root','pass'); } catch (Exception $e) { echo '数据库链接失败'; die; }
// 事务操作步骤
try { // 1. 关闭自动提交 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
// 2. 开启一个事务 (游戏中的存档) $pdo->beginTransaction();
// 3. 执行sql # 1) 扣钱 -10W $sql = "UPDATE `salary` SET `money`=`money`-100000 WHERE `uid` = 5 "; $rows = $pdo->exec($sql); if($rows < 1){ throw new Exception('工资转出失败'); }
# 2) 加钱 +10W $sql = "UPDATE `salary` SET `money`=`money`+100000 WHERE `uid` = 4 "; $rows = $pdo->exec($sql); if($rows < 1){ throw new Exception('工资转入失败'); }
// 4. 执行成功, 提交事务, 真正的改变sql状态 $pdo->commit();
} catch (Exception $e) { // 4. 执行失败, 回滚事务, 回到开始事务时的sql状态 echo $e->getMessage(); $pdo->rollBack(); # 读档 }
// 5. 开启自动提交 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
|