一、前言只有InnoDB引擎支持事务,以下内容以InnoDB引擎为默认条件二、常见并发问题1、脏读一个事务读取未提交的数据另一个事务数据2.不可重复读一个事务读取相同数据的结果是不一致的。3、幻读幻读是指当一个事务读取到一定范围内的数据时,由于其他事务的操作导致前两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对某一行数据,而幻读是针对不确定的多行数据。因此,幻读通常出现在有查询条件的范围查询中。3.事务隔离级别1,未提交读(READUNCOMMITTED)可能导致脏读,不可重复读,幻读2,已提交读(READCOMMITTED)避免脏读可能导致不可重复读,幻读3,可重复读(REPEATABLEREAD)(mysql默认隔离级别)避免脏读、不可重复读。通过区间锁技术避免幻读4、序列化(SERIALIZABLE)序列化可以避免所有可能的并发异常,但会大大降低系统的并发处理能力4、数据库日志有哪些?1.undologundolog用来存储数据被修改前的值。UNDOLOG分为两种,一种是INSERT_UNDO(INSERT操作),记录插入的唯一键值;另一种是UPDATE_UNDO(包括UPDATE和DELETE操作),记录修改后的唯一键值和旧的列记录。2.重做日志mysql会先将一个事务中的所有sq记录到重做日志中,然后将重做日志中的记录同步到数据文件中。它可以带来这些好处:当缓冲池中的脏页还没有刷新到磁盘时,启动服务后,可以通过重做日志找到需要刷新到磁盘文件的记录;bufferpool中的数据直接flush到磁盘文件中,属于随机IO,效率较差,而bufferpool中redolog中记录的数据是顺序IO,可以提高事务提交的速度;3、binlog日志用于数据库主从复制记录,为二进制格式。事务提交后执行磁盘写入。这里要注意redolog和binarylog的区别。重做日志由存储引擎层产生,而二进制日志由数据库层产生。假设一个大事务,100,000行记录被插入到tba中。在此过程中,redolog中会不断记录记录,但不会记录binarylog。在事务提交之前,它不会被写入二进制日志文件。Part5.数据库事务控制1.默认开启事务自动提交功能。每执行一条sql,就会对应一次事务的提交。2、Spring会将底层连接的自动提交特性设置为false。使用手动提交六、事务ACID特性1、原子性(Atomicity)事务中的所有操作作为一个整体都像原子一样不可分割,要么全部成功,要么全部失败。2.一致性(Consistency)java训练中事务的执行结果必须使数据库从一种一致状态进入另一种一致状态。状态一致是指:1.系统的状态满足数据的完整性约束(主码、参照完整性、校验约束等)2.系统的状态反映了现实世界的真实状态数据库应该描述,如两个事务传输前后。每个帐户中的金额总和应保持不变。3.隔离性并发执行的事务不会相互影响,它们对数据库的影响与串行执行时是一样的。比如多个用户同时向一个账户转账,那么最终账户的结果应该和他们依次转账的结果是一样的。4.持久性一旦事务被提交,它对数据库的更新是持久的。任何事务或系统故障都不会导致数据丢失。5、redolog和undolog实现了原子性、一致性和持久性。6、锁机制实现隔离。6.1.快照读取读取的是快照版本,即历史版本。普通SELECT是snapshotread6.2,当前读取读取最新版本。UPDATE、DELETE、INSERT、SELECT...LOCKINSHAREMODE、SELECT...FORUPDATE当前已读取。6.3.锁定读 在一个事务中,标准的SELECT语句是不会被锁定的,但是有两个例外。选择...锁定共享模式并选择...进行更新。SELECT...LOCKINSHAREMODE 假定记录的共享锁。这样其他事务只能读取不能修改,直到当前事务提交SELECT...FORUPDATE 锁定索引记录。这种情况下,跟UPDATE的锁情况一样6.4、Consistentnon-lockingreadConsistentread(一致读),InnoDB使用多个版本来提供查询数据库在某个时间点的快照。如果隔离级别是REPEATABLEREAD,那么同一个事务中的所有一致性读都会读取事务中第一个这样的读的快照;如果它是READCOMMITTED,那么事务中的每个一致读取都将读取它自己的刷新快照版本。一致性读(consistentread)是READCOMMITTED和REPEATABLEREAD隔离级别下普通SELECT语句的默认模式。一致读取不会对其访问的表施加任何形式的锁定,因此其他事务可以同时修改它们。
