网站总是跳转,昌吉建设局网站,程序员最低学历要求,湖南昌正建设有限公司网站一. 并发事务带来的问题
并发会造成事务间出现脏读#xff0c;不可重复读#xff0c;幻读现象。
1. 脏读 一个事务在处理过程中读取了另外一个事务未提交的数据。若另外一个事务回滚#xff0c;则读取到的数据是无效的#xff0c;又称为脏读。
2. 不可重复读 在一个事务…一. 并发事务带来的问题
并发会造成事务间出现脏读不可重复读幻读现象。
1. 脏读 一个事务在处理过程中读取了另外一个事务未提交的数据。若另外一个事务回滚则读取到的数据是无效的又称为脏读。
2. 不可重复读 在一个事务内多次读取同一数据在这个事务还没结束时另外一个事务也访问了这个数据并对这个数据进行了修改那么就可能造成第一个事务两次读取的数据不一致这种情况就被称为不可重复读。
3. 幻读 同一个事务内多次查询返回的结果集总数不一样比如增加了或者减少了行记录。
二. 事务隔离等级
隔离等级描述READ UNCOMMITTED允许事务读取未被其他事务提交的变更脏读不可重复度和幻读的问题都会出现READ COMMITTED只允许事务读取已经被其它事务提交的变更可以避免脏读,但不可重复读和幻读问题仍然可能出现REPEATABLE READ确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读但幻读的间题仍然存在SERIALIZABLE确保事务可以从一个表中读取相同的行。在这个事务持续期间禁止其他事务对该表执行插入,更新和删除操作。所有并发问题都可以避免,但性能比较低 安全性: Serializable Repeatable read Read committed Read uncommitted 效率: Serializable Repeatable read Read committed Read uncommitted MySQL默认事务隔离等级为Repeatable read MySQL查看事务隔离等级
# 查看事务隔离等级
select transaction_isolationMySQL修改事务隔离等级 SESSION表示修改当前会话 GLOBAL表示修改全局配置 # 修改当前会话隔离等级为READ UNCOMMITTED
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
# 修改当前会话隔离等级为READ COMMITTED
set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
# 修改当前会话隔离等级为REPEATABLE READ
set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
# 修改当前会话隔离等级为SERIALIZABLE
set SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE 三. 脏读演示
新建account表并插入2条数据create table account(id int primary key AUTO_INCREMENT comment ID,name varchar(10) comment 姓名,money double(10, 2) comment 余额
) comment 账户表;
insert into account(name, money) values (张三, 2000), (李四, 2000);insert into account(id, name, money) values (3, 王五, 2000);从上图中可以看出事务1读取到了事务2未提交的数据这就是脏读。
四. 不可重复读演示 如果要解决脏读需要将事务的隔离等级修改为READ COMMITTED 从上图中可以看出当把事务隔离等级修改为READ COMMITTED后事务1(步骤2)没有读取到事务2未提交的数据。 但是当事务2提交后事务1会读取到事务2已经提交的数据这就出现了不可重复读的问题即在事务1中读取同一张表两次的结果不一样。 要解决不可重复读需要将事务的隔离等级调整为REPEATABLE READ。 从上图中可以看出事务1两次读取的数据是一致的没有出现不可重复读的问题。
五. 幻读演示 REPEATABLE READ虽然解决了不可重复读但同时可能会出现幻读的问题。 从上图中可以看出事务1不能查询到事务2已经插入的数据导致出现了“幻觉”当事务1执行同样的插入语句时就会报主键重复错误这就是幻读。
幻读的解决
当把事务的隔离等级调整为SERIALIZABLE时就可以解决幻读的问题。 从上图中可以看出当事务2执行插入语句时会被阻塞只有当事务1提交了后事务2的插入语句才能执行。