MySQL数据库事务隔离级别(事务隔离级别)
然后讨论了修改事务隔离级别的方法。
1。全球mysql.ini修改,修改配置文件,并将其添加在最后
复制代码代码如下所示:
#可选参数:read-uncommitted,read-committed,repeatable-read,序列化。
{他}
事务隔离= repeatable-read
全局默认是repeatable-read,MySQL实际上是默认级别
2。对当前会话修改,在登录到MySQL客户机之后,执行命令:
记住,MySQL具有自动提交参数,默认的是,他的角色是单一的查询是一种交易,自动启动,自动提交(结束后,自动执行,如果你想申请选择更新而开始交易,手动调用更新的行锁机制是没有用的,因为行锁被释放在自动提交后),所以事务隔离级别和锁机制,即使你不显式调用开始交易,这一机制在一个单独的分析查询也是适用的,锁操作的时候要注意这一点
然后谈谈锁机制。
共享锁:读取表操作加上锁和锁后,其他用户只能获得表或行的共享锁,不能获得独占锁,也就是说只能读取或写入。
互斥锁:通过写表操作添加的锁。锁定后,其他用户无法获得表或行的任何锁,通常在MySQL事务中。
复制代码代码如下所示:
开始交易;
SELECT * FROM用户userid里= 1更新;
完成这句话后
1)当其他交易想获得一个共享锁,如可串行化的事务隔离级别,执行
复制代码代码如下所示:
从用户中选择*;
它将被挂起因为序列化的SELECT语句需要获取一个共享锁
2)执行其他事务时
复制代码代码如下所示:
SELECT * FROM用户userid里= 1更新;
更新用户设置userage = 100其中UserID = 1;
它也将被挂起,因为更新将获得这一行数据的行锁,并且需要等到上一个事务释放行锁继续为止。
锁的范围:
行锁:锁定一行记录
表锁:锁定整个表
它与行级共享锁、表级共享锁、行级锁和表级锁相结合。
接下来,我们来讨论不同事务隔离级别的实例效果。该示例使用InnoDB开放两个客户端A和B,修改事务隔离级别,公开交易数据和修改B,再看看交易的改性效果在,
1.read-uncommitted(未提交读内容)水平
1)更改事务级别并启动事务,并向用户表查询。
U3000 U3000 U3000
2)B更新记录
U3000 U3000 U3000
3)此时,B事务尚未提交,a在事务中进行查询,并发现查询结果已更改。
U3000 U3000 U3000
4)b执行事务回滚。
U3000 U3000 U3000
5)再次执行查询,查询结果返回。
U3000 U3000 U3000
6)表修改用户表的数据。
U3000 U3000 U3000
7)B在事务之后重新启动,修改用户表记录,修改被挂起直到超时,但另一个数据修改成功,这意味着对用户表数据进行修改以增加额外的共享锁(因为您可以使用select)
U3000 U3000 U3000
read-uncommitted隔离级别可以看出。当两个事务同时进行时,即使事务未提交,修改也会影响事务中的查询。这个级别显然是非常不安全的,但是当表被修改为一行时,行与行共享。
2。read-committed(读提交)
1)设置A的事务隔离级别,并为查询输入事务
U3000 U3000 U3000
2)B启动事务并修改记录。
U3000 U3000 U3000
3)再次查询用户表,并发现记录没有受到影响。
U3000 U3000 U3000
4)提交事务
U3000 U3000 U3000
5)查询用户表并发现记录已被修改。
U3000 U3000 U3000
6)更改用户表
U3000 U3000 U3000
7)B重新启动事务并修改同一个用户表。发现更改暂停到超时,但是另一个记录的修改成功了,表明A的修改增加了一个行共享锁到用户表(因为它可以选择)。
U3000 U3000 U3000
U3000 U3000 U3000
对read-committed事务隔离级别只会在提交后交易的另一个交易的影响,并添加一个行共享行表数据行时修改表。
三.REPEATABLE-READ (reread)
1)设置事务隔离级别,在进入事务后查询一次
U3000 U3000 U3000
2)B启动事务并修改用户表。
U3000 U3000 U3000
3)查看用户表的数据,而数据没有改变。
U3000 U3000 U3000
4)提交事务
U3000 U3000 U3000
5)再次查询,结果仍然没有改变。
U3000 U3000 U3000
6)提交事务后,对结果进行评审,并对结果进行更新。
U3000 U3000 U3000
7)重启事务并修改用户表。
U3000 U3000 U3000
U3000 U3000 U3000
8)B表重新启动事务并修改用户表。修改暂停到超时,并且成功地修改了其他记录。它表明,当更改表时,会添加行共享锁(select)。
U3000 U3000 U3000
U3000 U3000 U3000
repeatable-read事务隔离级别。当两个事务同时进行时,一个事务修改数据不会影响另一个事务。即使已提交修改过的事务,也不会影响其他事务。
事务中的记录的更改将在行结束时添加到行共享锁中,直到事务结束。
4.serierlized(序列化)
1)修改A的事务隔离级别并进行查询
U3000 U3000 U3000
2)B查询表以得到正常的结果,我们可以看到对用户表的查询可以完成。
U3000 U3000 U3000
3)B启动事务并修改记录,因为事务未提交,因此B的修改处于等待状态,等待事务完成,最后超时,这表明在对用户表进行查询操作之后,a将共享锁添加到表中。
U3000 U3000 U3000
可序列化事务隔离级别是最严重的。在查询时,它将向表或行添加共享锁。其他事务只读取表上的操作,但不写操作。