首页 > 编程知识 正文

事务默认的隔离级别,MySQL事务隔离级别

时间:2023-05-06 10:50:24 阅读:27759 作者:2979

事务隔离级别:与一个事务对数据库的更改并行的另一个事务的隔离级别。

如果两个并发事务同时访问数据库表中的同一行,则可能存在以下三个问题:

1、幻想读法:事务T1读指定where条件的句子,返回结果集。 此时,事务T2插入一行新记录,正好满足T1的where条件。 然后T1使用相同的条件再次调查的话,结果集中可以看到T2插入的记录,这一新记录是幻想。

2、不能重复。 事务T1读取了一行记录,并修改了紧接事务T2之后T1刚刚读取的记录。 之后,T1再次进行询问,发现与最初读取的记录不同。 不要重复这个。

3、脏读:事务T1更新了一行记录。 尚未提交更改。 T2读取更新的数据,然后T1执行回滚操作以取消刚才的更改。 因此,T2读取的行无效,即成为脏数据。

为了解决这些问题,SQL标准定义了以下事务隔离级别

READ UNCOMMITTED允许虚幻读取、不可重复读取和不洁读取。

READ COMMITTED不允许虚幻读取、不可重复读取或不洁读取

REPEATABLE READ允许虚幻读取,不得重复读取或污染

序列化幻想读法、不可重复读法、不洁读法是不允许的

Oracle数据库支持事务隔离级别READ COMMITTED和序列化。 所以Oracle不支持脏读

SQL标准中定义的默认事务隔离级别是序列化级别,但Oracle默认使用读取提交

设置隔离级别settransactionisolationlevel [ read uncommitted ] (可重复读取)

以下是oracle设置序列化隔离级别的示例:

左边是事务T1,右边是事务T2。 由于T2级别是序列化的,因此即使事务T1提交数据,事务T2也不会看到T1提交的数据,也不会允许幻想读取或不可重复读取。

我怎么才能看到T1的新记录? 上面的T1和T2是并发的,在T1上运行insert时,事务T2已经开始。 由于T2级别是序列化的,因此T2查询的数据集是T2事务启动之前数据库中的数据。 也就是说,事务T2启动后事务T1的插入和更新操作的影响不会影响事务T2。 重新打开事务T3时,将显示T1的新记录。

当发生以下事件时,事务将启动:

1、连接数据库,执行第一个DML语句

2、上一个事务结束后,输入了另一个DML语句

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。