您的位置:首页 > 数据库 > MySQL

mysql事务处理和不同隔离机制

2014-03-05 15:37 831 查看
事务执行的两种方式
事务的隔离性
事务的非事务解决方案

事务作为一个不可分割的逻辑单元执行一组sql语句,他们的执行效果可以被撤销。通过提交(commit)和回滚(rollback)的方式来实现。
事务的ACID原则:原子性、隔离性、独立性、一致性

事务执行的两种方式(默认情况下为自动提交模式):

第一种方式:
start transaction;
select * from car_info;
rollback; 回滚
update car_info set name = 'dahzong' where id = 1;
commit;
第二种方式:
set autocommit = 0;

select * from car_info;
update car_info set name = 'dahzong' where id = 1;

commit;
set autocommit = 1;

事务的隔离性

不同客户可能会在同一时间访问数据表的同一行数据,MyISAM采用表级锁定机制,保证不同用户不能在同一时间修改同一段内容,但这种做法会导致更新量比较大的系统上并发性能大大降低。InnoDB采用粒度更细的行级锁定机制保证用户在修改某一行数据时,其他用户还可以修改其他行数据。如果两个用户同时更新某一行数据,那么先锁定的用户可以先修改他。

这里有一个问题:一个用户的事务在何时才能看到其他用户事务对数据做出的修改?

InnoDB采用不同的事务隔离级别保证用户在何时能够看到其他用户事务做出的修改。

在不同事务执行的过程中可能会出现如下问题:

脏读:某个事务做出的修改在未提交时被其他事务通过SELECT读取到,其他事务会认为数据已经被修改,而这时该事务回滚,导致数据发生混乱
不可重复读取:同一个事务执行两次相同的SELECT语句,而在两次SELECT之间,其他事务对数据进行修改,导致两次读取结果不一样

为了解决这些问题,InnoDB采用不同的隔离机制解决上述问题:
READ UNCOMMITED:允许某个事务读取其他事物未提交的修改
READ COMMITED:只允许某个事务读取到其他事务提交的改动
REPEATABLE READ:为了解决不可重复读取的问题,当其他事务在修改数据时,其他事务两次SELECT读到的结果也是一样的
SERIALIZABLE:最为严格的事务隔离机制,当某个事务在对数据行进行修改时,其他事物必须等待

InnoDB默认的隔离机制是REPEATABLE READ
set global  transaction isolation level repeatable read;  设置全局事务级别
set session transaction isolation level repeatable read;  设置当前会话时事务级别
set transaction isolation level repeatable read;      设置下一个事务级别

事务的非事务解决方案

对于不支持事务的数据库可以采用明确锁定数据表的方式实现事务

lock tables car_info read;
select id from car_info;
unlock tables;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息