阅读 52

mysql事务隔离学习

事务是什么:具有ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

事务并发出现的问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

隔离级别:

读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。

读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

二者关系:

事务隔离级别脏读不可重复读幻读
读未提交
读提交
可重复读
串行化

事务的每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

系统会自动判断,当没有事务使用回滚日志的时候,再将回滚日志删除。

不建议使用长事务! mysql5.5及其以前,由于所有回滚记录都会保留,导致占用大量内存空间,由于数据和回滚段保存在同一个文件中,不能之间删除文件,文件也不会变小,清除的空间仅仅是可以给配给其他数据存储,不再被回滚段占用而已。

事务的启动方式: 1、显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。 2、set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

注意:有些客户端链接框架默认先执行set autocommit=0,如果使用的是长连接,可能意外导致长事务,因此建议使用set autocommit=1,通过显式语句启动事务

对于频繁使用的事务的业务,不用每次都写begin,使用commit work and chain--提交事务并且自动启动下一个事务,减再次执行begin的开销。

可以在 information_schema 库的 innodb_trx 这个表中查询长事务,比如下面这个语句,用于查找持续时间超过 60s 的事务。 select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

文章分类
代码人生
文章标签