START TRANSACTION;
-- 录入学生的考试成绩
UPDATE student_scores SET score = 85 WHERE student_id = 2001;
-- 如果没有这个学生,则上面成绩属于是录入失败的
IF (SELECT score FROM scores WHERE student_id = 2001) = 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
查看数据库自动提交事务设置情况
SHOW VARIABLES LIKE ‘autocommit’;
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.07 sec)
当你在 MySQL 客户端执行这条命令时,它会返回一个结果集,显示 autocommit 变量的值。
如果 autocommit 的值为 ON,则表示 MySQL 会自动提交每一条单独的 SQL 语句作为一个独立的事务
SHOW SESSION VARIABLES LIKE ‘transaction_isolation’;
mysql> SHOW SESSION VARIABLES LIKE 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
查看全局隔离级别
SHOW GLOBAL VARIABLES LIKE ‘transaction_isolation’;
mysql> SHOW GLOBAL VARIABLES LIKE 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
设置隔离级别
- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 全局级别的设置会影响到所有新建立的会话,但对于已经存在的会话不会立即生效
- 只有当这些会话重新建立连接时才会应用新的隔离级别。
四种隔离级别
set global transaction isolation level read uncommitted
读未提交 - Read Uncommitted
现象:一个终端写,另外一个终端也会读到
一个事务在执行中,读到另一个执行中事务的更新但未 commit 的数据,这种情况属于脏读
读已提交 - Read Committed
set global transaction isolation level read committed
现象:一个终端写,不提交另外一个终端读不到
一个事务在执行中,提交前和提交后,使得另一个事务读到不同的结果
尽管解决了脏读的问题,但还是会出现其他问题(针对一个事务在提交前提交后,另一个事务读取结果的问题)
不可重复读:当对一个事务一条数据进行修改时,另一个事务可能第一次读和第二次读的结果不一样
幻读:同样的条件,一个事物对数据进行新增删除时,另一个事物第一次和第二次读的记录数不一样
可重复读 - Repeatable Read
set global transaction isolation level repeatable read