# 提交事务
mysql> commit;
Query OK, 0 rows affected (0.11 sec)
#回滚事务
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
#设置保存点
mysql> savepoint rqtanc;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from rqtanc_test;
+------+------+
| id | name |
+------+------+
| 1 | 12 |
+------+------+
1 row in set (0.27 sec)
mysql> insert into rqtanc_test value(2,'1');
Query OK, 1 row affected (0.25 sec)
mysql> select * from rqtanc_test;
+------+------+
| id | name |
+------+------+
| 1 | 12 |
| 2 | 1 |
+------+------+
2 rows in set (0.00 sec)
# 回滚到设置保存点
mysql> rollback to savepoint rqtanc;
Query OK, 0 rows affected (0.17 sec)
mysql> select * from rqtanc_test;
+------+------+
| id | name |
+------+------+
| 1 | 12 |
+------+------+
1 row in set (0.00 sec)
2.2、隐式事务
关键字 :autocommit
sql复制代码
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
3、事务的隔离级别
查看数据库隔离级别: transaction_isolation;
sql复制代码
mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.19 sec)
设置事务的隔离级别
sql复制代码
#方式一:
SET [ GLOBAL | SESSION ] TRANSACTION ISOLATION LEVEL [ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE ];
#方式二:
SET [ GLOBAL | SESSION ] TRANSACTION_ISOLATION = [ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE ];
3.1、数据并发问题
脏写: 对于两事务session A 、session B,如果session A 修改了 另一个 未提交 事务 session B 修改过的事务,则意味着脏写。 如下所示,当session B事务进行回滚,session A中更新也被回滚。
序号
session A
session B
①
begin
②
begin
③
update user set user_name = '张三' where user_id = '1'
④
update user set user_name = '李四' where user_id = '1'
⑤
commit
⑥
rollback
脏读: 对于session A、session B ,session A 读取了 已经被 session B 更新 但还 没有被提交 的字段。之后若session B 回滚,session A 读取的 内容就是 临时且无效的。 如下所示:当修改session B 回滚后,session A 中的事务相当于读取到了一个不存在的数据,则称为 脏读。
序号
session A
session B
①
begin
②
begin
③
update user set user_name = '张三' where user_id = '1'
④
select * from user where user_id = '1';如果读取到的user_name数据为张三,则意味着发生脏读
⑤
commit
⑥
rollback
不可重复读:对于 session A、session B,session A 读取 了一个字段,然后session B 更新了该字段,之后session A 再次读取同一个字段,值不同了 。则发生了 不可重复读。
序号
session A
session B
①
begin
②
select * from user where user_id = '1'; (此时user_name 为王五)
③
update user set user_name = '张三' where user_id = '1'
④
select * from user where user_id = '1'; (如果 user_name 的值 为 张三,则意味着发生 不可重复读)
⑤
update user set user_name = '李四' where user_id = '1'
⑥
select * from user where user_id = '1'; (如果 user_name 的值 为 李四,则意味着发生 不可重复读)
幻读: 对于两个事务 session A 、session B ,session A 从表中读取一个字段,然后session B 在该表中插入新的行。之后如果session A 再次读取 同一个表,就会多出几行。则意味着发生 幻读。
序号
session A
session B
①
begin
②
select * from user where user_id >0; (此时user_name 为王五)
③
insert into user value ('2','张三');
④
select * from user where user_id > 0 ; (此时user_name 为王五和张三的记录,则意味着发生 幻读)