三网合一网站源码下载,英才网,望野古诗原文翻译,设备上哪个网站做外贸推广目录
1.为什么要有隔离性
2.事务的隔离级别
读未提交
读提交
可重复读
串行化
3.演示事务隔离级别的操作
查看与设置事务的隔离级别
演示读提交操作
演示可重复读操作 1.为什么要有隔离性 在真正的业务场景下#xff0c;MySQL服务在同一时间一定会有大量的客户端进程…目录
1.为什么要有隔离性
2.事务的隔离级别
读未提交
读提交
可重复读
串行化
3.演示事务隔离级别的操作
查看与设置事务的隔离级别
演示读提交操作
演示可重复读操作 1.为什么要有隔离性 在真正的业务场景下MySQL服务在同一时间一定会有大量的客户端进程并发的去访问同一个MySQL服务而且一定会同一时间有多个客户端访问和操作同一张表。而且我们在业务层面一个事务很多情况下都需要多条SQL语句组成那么这样的话操作虽然是原子性的但是过程却可以明显的分成执行前、执行中以及执行后三个阶段。 那么在执行中的阶段一个客户端在执行事务操作数据库表但是事务还没有完成提交其其他客户端如果查看到该客户端没有提交的数据会不会有问题呢如果客户端查看了另一个客户端没有提交的数据但是另一个客户端最后执行了回滚操作那么该客户端查看的数据就不是真实的数据了出现了数据的二义性。 所以说为了保证数据库在执行事务操作过程中尽量不受到干扰就有了一个重要的特性就是隔离性。但是也并非客户端在执行事务的时候不能让其他客户端查看自己没有提交的数据在一些更关注数据的实时性的业务操作中就能够接受短暂的数据不一致问题。 2.事务的隔离级别 事务的隔离级别分为读未提交、读提交、可重复读、串行化不同的隔离界别可以让蛇舞收到不同程度的干扰可以用于不同的业务场景。对于隔离级别的实现基本上都是通过锁实现了因为多客户端访问也相当于是多线程的并发访问所以说还是要用锁。对于不同的隔离级别锁的使用是不同的常见的有表锁、行锁、读锁、写锁等等。 对于事务的隔离级别是相对于自己而言的如果说一个客户端A是读未提交客户端B是读提交那么客户端B想要提取客户端A在事务中操作的结果就需要在客户端A提交之后才可以看得到。
读未提交 该隔离级别属于是最低的隔离界别相当于没隔离一样所有的事物都可以看到其他事物没有提交的执行结果这种隔离界别在实际的业务中基本上是不会使用的。会有很多的并发问题例如脏读、幻读、不可重复读等问题。
事务的并发问题 脏读 一个事务读取到了另一个事务未提交的操作结果就是脏读。由于未提交的事务数据可能回因为事务的回滚而改变所以读到的数据可能回出问题。 幻读 在一个事务内按照某个条件进行数据查询的时候第一次查询和第二次查询的结果集不同。可能是因为其他事务在这个期间对数据进行了操作。 不可重复读 在一个事务内对于同一个数据的多次读取结果不一致叫做不可重复读。可能因为在该事务执行期间其他事务对这个数据进行了修改等操作导致了读取数据的变化造成了该问题。 脏读更加聚焦于数据的插入和删除操作两次查看的数据量不一样而不可重复读更聚焦于数据的修改和删除的操作两次查看的数据量可能一样但是里面的数据不一样。
读提交 该隔离级别是大多数数据库的默认隔离级别但不是MySQL的也是普遍理解上最合适的一个隔离级别。该隔离级别规定了一个事务只能看到其他的已经提交的事务所改变的数据操作。这种级别的隔离就不会产数据的脏读问题了。因为只能读取到提交之后的存放在磁盘当中的永久化数据。但是还是会有不同重复读取的问题因为多次查看表数据的时候在此其他其他事务可能回修改表并提交事务。
可重复读 这是MySQL的默认隔离级别他确保同一个事务在执行的过程中多次读取操作数据的时候回看到同样的数据行。使得数据不会出现脏读、不可重复读取的问题但是会有幻读的问题。
串行化 串行化是数据库事务隔离级别中最高的级别。在串行化隔离级别下事务的执行是顺序的一个事务必须等待前一个事务完成提交或者回滚之后才能开始执行在等待过程中就会放入等待队列。就好像多个事务是在一条单行道上排队依次通过一样完全避免了并发事务之间的相互干扰。他会在每个读的数据行上面加上共享锁但是加锁就会有锁的竞争问题会大大降低效率。这种级别不会有任何的事务之间相互影响的问题了。 3.演示事务隔离级别的操作
查看与设置事务的隔离级别 事务隔离级别的设置分为全局的和会话级别的设置如果设置会话级别的话就相当于是对于一个客户端连接的设置关闭之后再重启还是会重制事务的隔离级别会按照全局的事务隔离界别来定义。 对于设置会话级别的事务隔离性不需要重启服务器但是设置全局级别话需要重启因为事务的隔离级别是受会话影响的客户端启动的会话隔离级别是从全局隔离级别复制过来的所以说全局隔离级别决定了客户端启动的时候的事务隔离级别但是事务在操作的时候是看会话的事务隔离级别的。 查看语法SELECT [SESSION | GLOBAL].TRANSACTION_ISOLATION; 设置语法SELECT [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }; 演示读提交操作
//客户但A————————————————————————————————————————————————————————
//设置会话隔离级别为读提交
mysql set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql begin;
Query OK, 0 rows affected (0.00 sec)//插入与提交事务
mysql insert into account values(1, 张三, 100), (2, 李四, 200);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql commit;
Query OK, 0 rows affected (0.01 sec)//客户但B————————————————————————————————————————————————————————
//设置会话隔离级别为读提交
mysql set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql begin;
Query OK, 0 rows affected (0.00 sec)//在客户端A提交之前查看表数据
mysql select * from account;
Empty set (0.00 sec)//在客户端A提交之后查看表数据
mysql select * from account;
--------------------
| id | name | blance |
--------------------
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
--------------------
2 rows in set (0.00 sec)//提交数据
mysql commit;
Query OK, 0 rows affected (0.00 sec)该操作客户端B在事务期间两次查看表数据的数据不一样这就是不可重复读。
演示可重复读操作
//客户但A————————————————————————————————————————————————————————
//设置会话隔离级别为可重复读
mysql set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)//开启事务插入数据提交事务
mysql begin;
Query OK, 0 rows affected (0.00 sec)
mysql insert into account values(3, 王五, 300);
Query OK, 1 row affected (0.00 sec)
mysql commit;
Query OK, 0 rows affected (0.00 sec)//客户但B————————————————————————————————————————————————————————
//设置会话隔离级别为可重复读
mysql set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql begin;
Query OK, 0 rows affected (0.00 sec)
//客户端A提交之前
mysql select * from account;
--------------------
| id | name | blance |
--------------------
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
--------------------
2 rows in set (0.00 sec)//客户端A提交之后
mysql select * from account;
--------------------
| id | name | blance |
--------------------
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
--------------------
2 rows in set (0.00 sec)//提交事务
mysql commit;
Query OK, 0 rows affected (0.00 sec)//自己提交事务之后查看表数据
mysql select * from account;
--------------------
| id | name | blance |
--------------------
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
| 3 | 王五 | 300.00 |
--------------------
3 rows in set (0.00 sec)