MyBatis源码学习之⼆MyBatis事务
MyBatis事务
本篇主要学习MyBatis的事务代码,从设计模式,代码实现,事务分类等三个⽅⾯进⾏学习。关于数据库事务的特性和隔离级别与传播级别此处不做学习,将会有另外的篇幅进⾏学习。
事务分类
MyBatis事务分为两个类型,分别是JdbcTransaction和ManagedTransaction。开发过程中主要使⽤前者,按照type="jdbc" 或者
type="managed" ,如不配置则会提⽰配置不完整。⽰例配置如下:
设计模式篇
两种事务类都是采⽤了⼯⼚模式进⾏创建,JdbcTransaction的创建⼯⼚是JdbcTransactionFactory,
代码如下:
datasource是什么意思ManagedTransaction的创建⼯⼚是ManagedTransactionFactory,代码如下:
⽽JdbcTransactionFactory和ManagedTransactionFactory都是实现了TransactionFactory接⼝,JdbcTransaction和ManagedTransaction都实现了Transaction接⼝,体现了设计原则中依赖倒转原则,即⾯向接⼝编程,依赖于抽象⽽不是具体。
代码实现篇
Transaction
该接⼝的作⽤,接⼝说明中是:Wraps a database connection.Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close.⼤概的意思就是:包装⼀个数据库连接,处理连接的⽣命周期,⼀个连接的声明周期包含了创
建,准备,提交或者回滚,关闭。该接⼝中定义了五个⽅法,代码如下
JdbcTransaction
该事务实现类直接利⽤JDBC的提交和回滚功能,并依赖于从管理事务作⽤域的数据源中获取的connection,延迟连接的获取直到getConnection()⽅法执⾏的时候,当⾃动提交开启的时候会忽略提交和回滚请求。
类变量:
protected Connection connection;//数据库连接
protected DataSource dataSource;//数据源
protected TransactionIsolationLevel level;//事务隔离级别
// MEMO: We are aware of the typo. See #941
protected boolean autoCommmit;//⾃动提交标识
构造函数 :
虽然有两个构造函数,但是在创建事务的时候是通过事务⼯⼚调⽤第⼀个构造函数创建事务
事务提交和回滚
关闭连接
关闭连接的时候重置了⾃动提交
此处注释值得注意:如果是查询操作,mybatis不会在⼀个连接上执⾏提交或者回滚。某些数据库在查询操作时会开启是数据库事务,并且在关闭连接前强制提交或者回滚。此时就是⼀个⼯作区,在关闭连接前设置⾃动提交为true。Sybase数据库此处会抛异常,也许是Sybase 不允许设置⾃动提交,有待后续确认。
打开连接:
此处就是从数据源中获取连接,在隔离级别部位null的情况下设置隔离级别,然后设置是否⾃动提交。
事务隔离级别:TransactionIsolationLevel,是⼀个枚举类,共五个枚举值。
其中的level值就是jdbc的Connection中定义的int值,此处mybatis做了⼀个枚举类的封装。
事务使⽤
定义了事务后我们在哪⾥使⽤呢?请继续向下看
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论