### 创建数据库和数据表
```sql
-- 步骤1:创建数据库 transaction_test
CREATE DATABASE IF NOT EXISTS transaction_test;
-- 步骤2:选择数据库
USE transaction_test;
-- 步骤3:创建表 account
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`accountno` int(11) DEFAULT NULL,
`value` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 步骤4:创建表 student
CREATE TABLE IF NOT EXISTS student (
studentid char(6) PRIMARY KEY,
name varchar(10),
sex char(2)
) ENGINE=InnoDB;
```
### 事务的提交
#### 步骤1
```sql
-- 开启事务
START TRANSACTION;
-- 插入账户信息(111,500)
INSERT INTO account (accountno, value) VALUES (111, 500);
-- 提交事务
COMMIT;
```
#### 步骤2
```sql
-- 开启事务
START TRANSACTION;
-- 插入账户信息(222,500)
INSERT INTO account (accountno, value) VALUES (222, 500);
```
在另一个 MySQL 客户端窗口查询 `account` 表中的记录,观察查询情况。
### 事务的回滚
#### 步骤1
```sql
-- 开启事务
START TRANSACTION;
-- 插入账户信息(444,500)
INSERT INTO account (accountno, value) VALUES (444, 500);
-- 设置保存点 p1
SAVEPOINT p1;
-- 将账号为“444”的账户余额增加1000
UPDATE account SET value = value + 1000 WHERE accountno = 444;
```
#### 步骤4
```sql
-- 回滚事务到保存点 p1
ROLLBACK TO SAVEPOINT p1;
```
#### 步骤6
```sql
-- 回滚整个事务
ROLLBACK;
```
#### 步骤7
```sql
-- 查看 account 表中记录情况
SELECT * FROM account;
```
### 事务的原子性
#### 步骤1
```sql
-- 开启事务
START TRANSACTION;
-- 插入两条账户信息(555,500)和(666,500)
INSERT INTO account (accountno, value) VALUES (555, 500), (666, 500);
-- 提交事务
COMMIT;
```
#### 步骤2
```sql
-- 开启第二个事务
START TRANSACTION;
-- 插入两条账户信息(777,500)和(888,-500)
INSERT INTO account (accountno, value) VALUES (777, 500), (888, -500);
-- 回滚事务
ROLLBACK;
```
### 事务的隔离性
#### 步骤1
在 navicat 客户端使用 root 用户在事务中将账号为“111”的余额增加500,但不提交该事务。
#### 步骤2
```sql
-- 使用 root 账户登录,在 mysql 客户端创建用户 ok,并赋予操作权限
CREATE USER 'ok'@'localhost' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON transaction_test.* TO 'ok'@'localhost';
-- 使用 ok 账户登录
-- 开启事务
START TRANSACTION;
-- 将账号为“111”的余额增加 500
UPDATE account SET value = value + 500 WHERE accountno = 111;
```
当 root 用户打开事务使用 commit 命令提交后,发现了什么?
### 注意
请按照具体环境修改 SQL 语句中的数据库和表名。在 MySQL 客户端执行上述 SQL 语句进行演示。由于涉及事务操作,请谨慎执行。
实验---------------七
于 2023-12-30 16:16:09 首次发布