修改admin表格结构,设置id字段为索引。 启动两个事务,第一个事务中检索id=1的记录,施加排它锁,在未提交之前,在第二个事务中,修改id=1的记录,验证排它锁的效果。 要求:给出表格的创建代码和两个事务的实验代码,并给出和分析运行结果。
时间: 2024-02-12 13:04:02 浏览: 28
首先,我们需要创建一个名为 admin 的表格,并设置 id 字段为主键索引:
```sql
CREATE TABLE admin (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10)
);
CREATE INDEX idx_admin_id ON admin (id);
```
接下来,我们可以创建两个事务来进行实验。第一个事务会检索 id=1 的记录并施加排它锁,第二个事务会试图修改 id=1 的记录,以验证排它锁的效果。
```sql
-- 事务1
BEGIN;
SELECT * FROM admin WHERE id = 1 FOR UPDATE;
-- 事务2
BEGIN;
UPDATE admin SET name='John' WHERE id = 1;
```
在执行上述代码时,事务1会锁定 id=1 的记录,并在未提交之前禁止其他事务对该记录进行修改。因此,事务2会被阻塞,直到事务1提交或回滚。
如果事务1提交,则事务2会成功修改记录。如果事务1回滚,则事务2会失败并显示错误消息。
需要注意的是,排它锁可能会导致死锁。如果事务1和事务2都在等待对方释放资源,则会发生死锁。因此,应该谨慎使用排它锁,并确保在使用时避免死锁的情况发生。
相关问题
首先确保admin数据表中有记录。启动两个会话客户端(session),将两个事务的隔离级别设置为“repeatable read”,设计两个事务的操作序列,验证该隔离级别下事务的执行效果。要求:给出两个事务的实验代码和运行结果,并分析运行结果。
好的,首先让我们来了解一下“repeatable read”隔离级别的特点:
在“repeatable read”隔离级别下,事务读取的数据集合是事务开始时存在的数据集合,即使其他事务对同一数据集合进行了修改,在本事务中读取的数据也不会发生变化,因此可以防止脏读和不可重复读,但是可能会出现幻读。
接下来,我们来设计两个事务的操作序列,实验代码如下:
```
-- 事务1
START TRANSACTION;
SELECT * FROM admin WHERE id=1;
-- 等待10秒钟,模拟事务2修改数据
SELECT SLEEP(10);
SELECT * FROM admin WHERE id=1;
COMMIT;
-- 事务2
START TRANSACTION;
UPDATE admin SET username='test' WHERE id=1;
COMMIT;
```
在上面的代码中,事务1首先读取id为1的记录,然后等待10秒钟,模拟事务2修改了该记录,最后再次读取该记录。事务2则是更新id为1的记录。
接下来,我们将两个会话客户端的隔离级别设置为“repeatable read”,并分别执行上述代码,得到以下运行结果:
会话1:
```
mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)
-- 执行事务1
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM admin WHERE id=1;
+----+----------+--------+
| id | username | status |
+----+----------+--------+
| 1 | admin | 1 |
+----+----------+--------+
1 row in set (0.00 sec)
-- 等待10秒钟,模拟事务2修改数据
mysql> SELECT SLEEP(10);
+----------+
| SLEEP(10)|
+----------+
| 0 |
+----------+
1 row in set (10.00 sec)
mysql> SELECT * FROM admin WHERE id=1;
+----+----------+--------+
| id | username | status |
+----+----------+--------+
| 1 | admin | 1 |
+----+----------+--------+
1 row in set (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
```
会话2:
```
mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)
-- 执行事务2
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE admin SET username='test' WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
```
从运行结果可以看出,事务1在读取id为1的记录时得到了正确的结果,即username为“admin”。等待10秒钟后再次读取该记录时,结果仍然是“admin”,没有发生不可重复读现象。这是因为“repeatable read”隔离级别下,读取的数据集合是事务开始时存在的数据集合,即使其他事务对同一数据集合进行了修改,在本事务中读取的数据也不会发生变化。
事务2在更新id为1的记录后提交,事务1再次读取该记录时,得到的结果仍然是“admin”,没有发生幻读现象。这是因为“repeatable read”隔离级别下,事务读取的数据集合是事务开始时存在的数据集合,其他事务对该数据集合进行的修改不会影响本事务的查询结果。
综上所述,“repeatable read”隔离级别可以保证事务的读取操作不会受到其他事务的修改影响,但是可能会出现幻读现象。
创建一个admin表,包括id和name两个属性,建表后向表中插入一条记录。 首先采用无事务的操作,删除表中的记录,然后查询数据表,查看结果。 然后采用事务来删除记录,首先向表格中插入一条记录,启动事务,删除该记录后执行回滚操作,再次查询数据表,查看结果。
首先,我们可以使用如下 SQL 语句来创建一个名为 `admin` 的表:
```sql
CREATE TABLE admin (
id INT PRIMARY KEY,
name VARCHAR(50)
);
```
然后,我们向 `admin` 表中插入一条记录:
```sql
INSERT INTO admin (id, name) VALUES (1, 'John Doe');
```
接下来,我们使用以下 SQL 语句来删除 `admin` 表中的记录:
```sql
DELETE FROM admin;
```
然后,我们可以使用以下 SQL 语句来查询 `admin` 表中的数据:
```sql
SELECT * FROM admin;
```
查询结果将为空,因为我们已经删除了 `admin` 表中的所有记录。
接下来,我们可以使用事务来删除记录。首先,我们向 `admin` 表中插入一条记录:
```sql
INSERT INTO admin (id, name) VALUES (1, 'John Doe');
```
然后,我们开启一个事务并删除该记录:
```sql
BEGIN;
DELETE FROM admin WHERE id = 1;
```
现在,我们执行回滚操作:
```sql
ROLLBACK;
```
现在,我们可以使用以下 SQL 语句来查询 `admin` 表中的数据:
```sql
SELECT * FROM admin;
```
查询结果将包含我们之前插入的一条记录,因为我们已经回滚了删除操作。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)