实验---------------七

### 创建数据库和数据表



```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 语句进行演示。由于涉及事务操作,请谨慎执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值