mysql隔离级别对应的问题_MYSQL隔离级别以及相对应操作

事务:

事务是一组原子性sql查询语句,被当作一个工作单元。若mysql对改事务单元内的所有sql语句都正常的执行完,则事务操作视为成功,所有的sql语句才对数据生效,若sql中任意不能执行或出错则事务操作失败,所有对数据的操作则无效(通过回滚恢复数据)。事务有四个属性:

1、原子性:事务被认为不可分的一个工作单元,要么全部正常执行,要么全部不执行。

2、一致性:事务操作对数据库总是从一种一致性的状态转换成另外一种一致性状态。

3、隔离性:一个事务的操作结果在内部一致,可见,而对除自己以外的事务是不可见的。

4、永久性:事务在未提交前数据一般情况下可以回滚恢复数据,一旦提交(commit)数据的改变则变成永久(当然用update肯定还能修改)。

读锁:

也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

写锁:

又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql

innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。

行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。

MVCC:多版本并发控制(MVCC,Multiversion

Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。

Autocommit:是mysql一个系统变量,默认情况下autocommit=1表示mysql把没一条sql语句自动的提交,而不用commit语句。所以,当要开启事务操作时,要把autocommit设为0,可以通过“set

session autocommit=0;”来设置

隔离级别(ACID):

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别

1.Read Uncommitted

2.Read Committed

3.Repeatable Read

4.Serializable

隔离级别

脏读

不可重复读

幻读

Read Uncommitted

Y

Y

Y

Read Committed

N

Y

Y

Repeatable(default)

N

N

Y

Serializable

N

N

N

下面用Mysql数据库做一些小实验

Mysql

版本号

mysql>selectversion();

查看InnoDB存储引擎

系统级的隔离级别

会话级的隔离级别

mysql>select@@global.tx_isolation,@@tx_isolation;

更改会话级的隔离级别

mysql>setsession tx_isolation='read-uncommitted';

mysql>setglobaltx_isolation='read-uncommitted';

Query OK, 0rowsaffected (0.00 sec)

mysql>select@@global.tx_isolation,@@tx_isolation;

关闭SQL语句的自动提交

mysql>setautocommit=off;

查看SQL语句自动提交是否关闭

mysql> show variables like 'autocommit';

mysql>createtabletao (col1 tinyint unsigned, col2varchar(20),primarykey(col1));

mysql> showcreatetabletao \G;

*************************** 1. row ***************************

Table: tao

CreateTable:CREATETABLE`tao` (

`col1` tinyint(3) unsignedNOTNULLDEFAULT'0',

`col2`varchar(20)DEFAULTNULL,

PRIMARYKEY(`col1`)

) ENGINE=InnoDBDEFAULTCHARSET=utf8

演示脏读

a4c26d1e5885305701be709a3d33442f.png

更改隔离级别为Read

Committed后,不存在脏读的问题。

mysql>setglobaltx_isolation='read-committed';

mysql>setsession tx_isolation='read-committed';

演示不可重复读

a4c26d1e5885305701be709a3d33442f.png

更改隔离级别为Repeatable

Read后,不存在不可重复读的问题。

mysql>setglobaltx_isolation='repeatable-read';

mysql>setsession tx_isolation='repeatable-read';

幻读

a4c26d1e5885305701be709a3d33442f.png

更改隔离级别为完全串行化

Serializable

后,不存在幻读的问题。

mysql>setglobaltx_isolation='serializable';

mysql>setsession tx_isolation='serializable';

在这种情况下,只允许一个事务在执行,其它事务必须等待这个事务执行完后才能执行。没有并发,只是单纯的串行。

注意:

再次测试Repeatable

Read这个隔离级别的时候。出现这种状况:

1.session1和session2都autocommit=0,tx_isolation='Repeatable-Read',并且start

transaction;

2.session1:新插入一条数据,并且commit,假设该col1=3;

3.session2:新插入一条数据,并且update

col1=3那条数据;通过并不报错。

4.session2:查询col1,发现数据被修改。并且执行commit操作;

5.session1:查询col1,发现col1还是原来的(步骤2)数据,而不是(步骤4)数据。

这时候就有点疑惑了。

6.session1:再次commit,并且查询。发现数据修改完毕。这里要提到的是,更新的时候需要做2次提交才会看见真实的数据。

回顾:当2个事务并行时,当第一个事务完成并commit,第二个也commit后,第一个事务需要再次commit才能看到变化过的数据。

Mysql隔离级别

感谢博主:慢慢来比较快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值