标签:中间 机制 pre int 无锁 art 个数 隔离级别 这一
事务的基本流程:
开启事务: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提供了一种机制,可以让不同的事务在操作数据时候,具有隔离性,从而保证数据的一致性
先来了解一下什么叫做“脏读”
“脏读”是指当一个事务正在访问数据,并且对数据进行了修改,这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据
举例:
添加版本号
乐观锁 无锁,客户端A读到v1,修改后将其置为v2,客户端B读到v2,与之前v1不一样(因为本来要将其改为v2的是客户端B),以此来区分
只加不减,只要更新的时候发现比原来的版本号大,就需慎重
事务的ACID特性
原子性(Atomicity):
事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分 的最小逻辑执行体。
一致性(Consistency):
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果 时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库 所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证 的。
隔离性(Isolation):
各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间 不能看到对方的中间状态,并发执行的事务之间不能互相影响。
持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘)。
标签:中间 机制 pre int 无锁 art 个数 隔离级别 这一
原文地址:https://www.cnblogs.com/hetaoyuan/p/11404450.html