数据库事务总结

最近找工作,学习了数据库事务方面的知识,查看了不少博客,总结了一些事务相关的知识,仅供面试参考。


数据库事务有四种基本属性ACID:原子性、一致性、隔离性、持久性。
对于多个事务的并发操作,会存在如下几种数据问题:
1、脏读:读取了未提交的数据(即无效的数据)。
2、不可重复读:同一个事务内,两次相同的查询返回了不同的结果。重点在于B修改的数据只有在事务提交后,才会对A事务产生影响。事务A在执行期间,会受到已提交事务的影响,属于读提交。
3、幻读:事务非独立执行时存在的现象,重点在于事务B不会对事务A造成影响,即使事务B已经提交,即事务A在执行期间,不受其它事务的影响。

不同的事务隔离级别,会存在不同的并发操作问题,实际中根据业务需求设置不同的级别。大多数数据库如oracle、sql server默认是read committed级别,MySQL默认repeatable read。下级别从低到高排列:

read uncommitted(读未提交): 可能存在脏读、不可重复读、幻读
read committed(读已提交): 可能存在不可重复读、幻读
repeatable read(可重复读): 可能存在幻读
serializable(可串行化): 通过锁机制避免了事务冲突,但效率低。

对于前三个级别,读操作是不加锁的,写操作会加共享锁。对于可串行化,读加共享锁,写加排它锁。

说到锁机制,数据库的锁锁分为共享锁、排它锁。

共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写。
排它锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁。

对于MySQL而言,若通过主键定位到具体一行数据,则添加的是行级锁,否则是表级锁。因此,数据库锁又具体划分为:行级共享锁,表级共享锁,行级排他锁,表级排他锁。

在MySQL中,事务操作命令如下:
查询事务隔离级别:select @@tx_isolation;或者set session|global transaction isolation level "级别名";
以上命令大小写皆可,session是设置当前会话(或者成为当前客户端),global是设置系统全局的隔离级别。
开启事务:start transaction;
提交事务:commit;
事务回滚:rollback;
关闭事务自动提交:set autocommit=off;

事务是建立在存储引擎之上的,数据库是组织、存储和管理数据的仓库。存储引擎是数据库存储数据的方式。
在mysql中,存储引擎是以插件的形式加载的。Mysql的存储引擎种类繁多,对于我们来说,要熟悉两种存储引擎MyISAM和InnoDB
MySQL5.5以后默认使用InnoDB存储引擎。

MyISAM VS InnoDB:MyISAM不支持事务、不支持外键,但访问速度快。InnoDB支持事务、支持外键,效率差些;MyISAM是表级锁,InnoDB是行级锁。

如有错误,请指出。

下面的博文给了我很大的帮助,博友可以参考下。

http://www.cnblogs.com/lizhonghua34/p/6187716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值