mysql怎么处理事务 mysql事务如何实现( 二 )


通过强制事务排序,使其不可能相互冲突,从而解决幻读问题 。简而言之,就是在每个读的数据行上加上共享锁实现,这个级别会导致大量的超时现象和锁竞争 , 一般不推荐使用
为了解决数据库并发控制问题,如走到同一时刻客户端对同一张表做更新或者查询操作,需要对并发操作进行控制,因此产生了锁
共享锁的粒度是行或者元组(多个行) , 一个事务获取了共享锁以后,可以对锁定范围内的数据执行读操作
排他锁的粒度与共享锁相同,一个事务获取排他锁以后,可以对锁定范围内的数据执行写操作
有两个事务 A 和 B,如果事务 A 获取了一个元组的共享锁,事务 B 还可以立即获取这个元组的共享锁 , 但不能获取这个元组的排他锁 , 必须等到事务 A 释放共享锁之后 。如果事务 A 获取了一个元组的排他锁 , 事务 B 不能立即获取这个元组的共享锁,也不能立即获取这个元组的排他锁,必须等到 A 释放排他锁之后
意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁和意向排他锁 。意向共享锁表示一个事务有意对数据上共享锁或者排他锁 。有意表示事务想执行操作但还没真正执行
锁的粒度主要分为表锁和行锁
表锁的开销最小,同时允许的并发量也是最小 。MyISAM 存储引擎使用该锁机制 。当要写入数据时,整个表记录被锁,此时其他读/写动作一律等待 。一些特定的动作 , 如 ALTER TABLE 执行时使用的也是表锁
行锁可以支持最大的并发,InnoDB 存储引擎使用该锁机制 。如果要支持并发读/写,建议采用 InnoDB 存储引擎
mysql的事务四个特性以及事务的四个隔离级别分别是原子性、一致性、隔离性、持久性 。
原子性是指事务包含的所有操作要么全部成功 , 要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响 。
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态 。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性 。
隔离性是当多个用户并发访问数据库时 , 比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到 。
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作 。例如我们在使用JDBC操作数据库时 , 在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后 , 就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成 。否则的话就会造成我们虽然看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误 。这是不允许的 。
在数据库操作中,在并发的情况下可能出现如下问题:
正是为了解决以上情况,数据库提供了几种隔离级别 。
数据库事务的隔离级别有4个 , 由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读?。erializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题 。

推荐阅读