MySQL- 事务操作

事务操作

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);