事务的管理

事务的基本流程:

开启事务:start transaction;

创建一个保存点:savepoint 保存点名

回到保存点(根据具体情况):rollback to保存点名

在MySQL上具体演示:

mysql> start transaction; --开启事务

Query OK, 0 rows affected (0.00 sec)

mysql> savepoint aa; --设置保存点aa

Query OK, 0 rows affected (0.00 sec)

mysql> insert into account values(1, '张三', 10); --添加一条记录

Query OK, 1 row affected (0.00 sec)

mysql> savepoint bb; -- 设置保存点bb

Query OK, 0 rows affected (0.00 sec)

mysql> insert into account values(2, '李四', 10000); --再添加一条记录

Query OK, 1 row affected (0.00 sec)

mysql> select * from account; --两条记录都在了

+----+--------+----------+

| id | name | balance |

+----+--------+----------+

| 1 | 张三 | 10.00 |

| 2 | 李四 | 10000.00 |

+----+--------+----------+

2 rows in set (0.00 sec)

mysql> rollback to bb; -- 发现后来添加这一条记录是误操作。所以回滚到bb状态

Query OK, 0 rows affected (0.01 sec)

mysql> select * from account; -- 第二条记录没有了

+----+--------+---------+

| id | name | balance |

+----+--------+---------+

| 1 | 张三 | 10.00 |

+----+--------+---------+

1 row in set (0.03 sec)

实务操作的注意事项:

1、如果没有设置事务保存点,也可以回滚,只能回滚到事务的开始,直接使用rollback(前提是事务并没有被提交)

2、如果一个事务被提交了(commit),则不能被回滚(rollback)

3、刻意选择回退到哪个保存节点

4、InnoDB支持事务,MyISAM不支持事务

5、开始事务用 start transaction

事务的隔离级别:

当我们有多个客户端同时操作数据库中的某张表的时候,如何进行隔离操作?MySQL提供了隔离级别

当这种情况发生的时候,MySQL提供了一种机制,可以让不同的事务在操作数据时候,具有隔离性,从而保证数据的一致性

先来了解一下什么叫做“脏读”

“脏读”是指当一个事务正在访问数据,并且对数据进行了修改,这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据

举例:

  • 1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
  • 2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
  • 3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000 像这样,Mary记取的工资数8000是一个脏数据

 

添加版本号
乐观锁 无锁,客户端A读到v1,修改后将其置为v2,客户端B读到v2,与之前v1不一样(因为本来要将其改为v2的是客户端B),以此来区分
只加不减,只要更新的时候发现比原来的版本号大,就需慎重

 

事务的ACID特性

原子性(Atomicity):

事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分 的最小逻辑执行体。

一致性(Consistency):

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果 时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库 所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证 的。

隔离性(Isolation):

各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间 不能看到对方的中间状态,并发执行的事务之间不能互相影响。

持久性(Durability):

持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘)。

原文地址:https://www.cnblogs.com/hetaoyuan/p/11404450.html