数据库
首页 > 数据库> > mysql事务学习

mysql事务学习

作者:互联网

事务

mysql中,事务能保证业务的完整性,是用户定义的一个数据操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

例:银行转账:
A 转100元  给B
A账户   -100
B账户 	+100

出现错误,没有一起成功,100元将无故丢失。

mysql控制事务

在 MySQL 中,事务的自动提交状态默认是开启的。

系统变量autocommit (用于控制是否自动提交事务)

//查看变量autocommit   --默认自动提交
mysql> select  @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

//修改变量  --关闭自动提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)

将自动提交关闭后,测试数据回滚:

INSERT INTO user VALUES (2, 'b', 1000);

-- 关闭 AUTOCOMMIT 后,数据的变化是在一张虚拟的临时数据表中展示,
-- 发生变化的数据并没有真正插入到数据表中。
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+

-- 数据表中的真实数据其实还是:
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

-- 由于数据还没有真正提交,可以使用回滚
ROLLBACK;

-- 再次查询
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

将虚拟的数据真正提交到数据库中

INSERT INTO user VALUES (2, 'b', 1000);
-- 手动提交数据(持久性),
-- 将数据真正提交到数据库中,执行后不能再回滚提交过的数据。
COMMIT;

-- 提交后测试回滚
ROLLBACK;

-- 再次查询(回滚无效了)
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+

手动开启一个事务

基本操作说明
start transaction; / begin;(手动)开始事务
commit;结束事务,提交()全部完成
rollback结束事务,回滚(回到初始状态)

autocommit = 1自动提交事务状态下,不改变系统变量,手动开启一个事务

BEGIN;
UPDATE user set money = money - 100 WHERE name = 'a';
UPDATE user set money = money + 100 WHERE name = 'b';

-- 由于手动开启的事务没有开启自动提交,
-- 此时发生变化的数据仍然是被保存在一张临时表中。
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+

-- 提交数据
COMMIT;

-- 测试回滚(无效,因为表的数据已经被提交)
ROLLBACK;

事务的四大特性(ACID)

数据库并发可能会出现的问题

事务的隔离性可分为四种 ( 性能从低到高 ) :

  1. READ UNCOMMITTED ( 读取未提交 )
    如果有多个事务,那么任意事务都可以看见其他事务的未提交数据。

  2. READ COMMITTED ( 读取已提交 )
    只能读取到其他事务已经提交的数据。

  3. REPEATABLE READ ( 可被重复读 )
    如果有多个连接都开启了事务,那么事务之间不能共享数据记录,否则只能共享已提交的记录。

  4. SERIALIZABLE ( 串行化 )
    所有的事务都会按照固定顺序执行,执行完一个事务后再继续执行下一个事务的写入操作。(这意味着队列中同时只能执行一个事务的写入操作 )

查看当前数据库的默认隔离级别:

-- MySQL 8.x, GLOBAL 表示系统级别,不加表示会话级别。
SELECT @@GLOBAL.TRANSACTION_ISOLATION;
SELECT @@TRANSACTION_ISOLATION;
+--------------------------------+
| @@GLOBAL.TRANSACTION_ISOLATION |
+--------------------------------+
| REPEATABLE-READ                | -- MySQL的默认隔离级别,可以重复读。
+--------------------------------+

-- MySQL 5.x
SELECT @@GLOBAL.TX_ISOLATION;
SELECT @@TX_ISOLATION;

修改隔离级别:

-- 设置系统隔离级别,LEVEL 后面表示要设置的隔离级别 (READ UNCOMMITTED)。
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 查询系统隔离级别,发现已经被修改。
SELECT @@GLOBAL.TRANSACTION_ISOLATION;
+--------------------------------+
| @@GLOBAL.TRANSACTION_ISOLATION |
+--------------------------------+
| READ-UNCOMMITTED               |
+--------------------------------+

标签:事务,--,money,学习,提交,mysql,+----+------+-------+,SELECT
来源: https://blog.csdn.net/qq_49067108/article/details/110682911