文章最初发表于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。上一篇主要讲了MySQL锁的概念,讲到了事务的概念。事实上,大多数开发人员对交易并不陌生。事务的概念其实就是一组SQL语句组成一个执行单元。如果单元中的某条SQL语句执行出现异常,则需要将整个事务回滚到未修改状态。只有当单元内的所有SQL语句都执行成功后,才会提交数据,代表事务执行成功。其实在之前的文章中我们已经知道Mysql是支持多种存储引擎的。其实正是因为MyISAM引擎不支持事务而被InnoDB所取代。所以这篇文章主要是让InnoDB引擎详细了解事务的概念。事务的原子性特点:事务是一个原子操作单元,它对数据的修改要么全部执行,要么根本不执行。一致性:事务中包含的处理必须满足数据库事先设置的约束,比如主键约束或NOTNULL约束。隔离性:事务处理过程中的中间状态对外界是不可见的。持久性:事务完成后,其对数据的修改是永久性的。隔离的四种隔离级别InnoDB引擎支持的四种事务隔离级别是:readuncommitted、readcommitted、repeatableread和serialread。ReadUncommitted:允许脏读,可以读取其他会话中未提交的脏数据。Readsubmitted:无法读取其他session未提交的数据。只能读取其他已经提交的session数据,属于不可重复读。Repeatableread:该级别的Repeatableread,InnoDB引擎默认使用repeatableread,不允许读取未提交的脏数据,但可能会出现InnoDB特有的幻读。串行读:该级别隔离度最高,事务只能依次串行执行,不能并发执行。每次串行读都需要获取表级共享锁,读写操作会被阻塞。幻读事务是插入一条已经检查过的不存在的记录,但是插入的结果是数据已经存在,之前的检查操作就像幻影一样。Mysql默认使用可重复读级别,所以只能出现幻读。设置事务隔离级别,可以在my.sql文件中的[mysqld]下配置transaction-isolation属性。提交、可重复读、串行读四种隔离级别。交易分类交易一般分为隐式交易和显式交易两种。在Mysql中,事务默认是自动提交的,所以每条DML语句其实就是一个事务过程。隐式事务:没有开始和结束标志,默认自动提交SQL语句。比如我们经常使用的INSERT、UPDATE、DELETE语句就是隐式事务。显示事务:打开和关闭显示,然后执行一系列操作。最后,如果所有操作执行成功,则提交事务以释放连接。如果操作出现异常,则回滚事务中的所有操作。事务使用启动事务的步骤:关闭自动提交,然后启动事务。事务性操作:执行一系列DML语句。事务结束:根据事务操作是否成功选择提交事务或回滚事务操作。接下来我们简单的使用事务来实现用户A到用户B的转账:创建用户表,插入两条用户数据:配置数据库连接信息:然后从连接池中取出一个数据库连接,进行数据库连接:数据库连接成功,然后使用连接对象启动事务:然后检查转账账户和待转账账户是否存在,并进行转账等一系列操作。这里由于魔鬼的回调,我使用async库变成了链式调用:最后根据事务操作成功或者提交事务或者回滚事务失败,释放数据库连接:然后就可以了测试转账成功,可以发现转账操作成功。再次测试转账失败的操作,可以发现扣A点和加B点的操作都回滚了,所以A和B的积分余额没有变化。欢迎关注公众号:程序员周先森。文章原发于微信公众号,本平台不定时更新。
