您的位置:首页 > 其它

事物的隔离级别

2017-01-16 14:56 197 查看
一.事物隔离级别的解析:1.不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。2. 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。3.脏读(Dirty Read):读取未提交数据 注意:要记住mysql有一个autocommit参数,默认是on,他的作用是每一条单独的查询都是一个事务,并且自动开始,自动提交(执行完以后就自动结束了,如果你要适用select for update,而不手动调用 start transaction,这个for update的行锁机制等于没用,因为行锁在自动提交后就释放了),所以事务隔离级别和锁机制即使你不显式调用starttransaction,这种机制在单独的一条查询语句中也是适用的,分析锁的运作的时候一定要注意这一点锁机制:共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写排它锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁,典型是mysql事务中的锁的范围:行锁: 对某行记录加上锁表锁: 对整个表加上锁这样组合起来就有,行级共享锁,表级共享锁,行级排他锁,表级排他锁 start transaction;select * from user where userId = 1 for update;执行完这句以后  1)当其他事务想要获取共享锁,比如事务隔离级别为SERIALIZABLE的事务,执行  select * from user;   将会被挂起,因为SERIALIZABLE的select语句需要获取共享锁  2)当其他事务执行  select * from user where userId = 1 for update;  update user set userAge = 100 where userId = 1;   也会被挂起,因为for update会获取这一行数据的排它锁,需要等到前一个事务释放该排它锁才可以继续进行  二.mysql修改事务隔离级别用 set transation 句改变单个回话或者说有新进连接的隔离剂别SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATAB9b13LE READ | SERIALIZABLE}1.查询全局和会话事务隔离级别
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: