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;
事务的隔离性
事务的非事务解决方案
事务作为一个不可分割的逻辑单元执行一组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;
相关文章推荐
- MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
- mysql事务表和非事务表在binlog日志的不同处理
- 理解MySql事务隔离机制、锁以及各种锁协议
- MySQL的事务处理及隔离级别
- PostgreSQL事务处理机制 (&与MySQL之间比较)
- 理解MySql事务隔离机制、锁以及各种锁协议
- MySQL事务处理和锁机制
- MySQL的事务处理及隔离级别
- MySQL的事务处理及隔离级别
- mysql的事务隔离机制
- 理解MySql事务隔离机制、锁以及各种锁协议
- 关于事务的隔离级别和处理机制的理解
- Mysql的事务以及隔离机制
- MySQL事务处理和锁机制
- 关于MySQL的事务处理及隔离级别
- Hibernate逍遥游记-第15章处理并发问题-001事务并发问题及隔离机制介绍
- AAA关于MySQL的事务处理及隔离级别
- 关于MySQL的事务处理及隔离…
- 关于MySQL的事务处理及隔离级别
- Oracle与Mysql数据的事务处理机制