一、Mybatis事务
1、事务管理方式
Mybatis中的事务管理方式有两种:
1、JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理
2、MANAGED的事务管理机制,Mybatis没有实现对事务的管理,而是通过容器来实现对事务的管理
其中,Mybatis提供了事务的接口:Transaction,其代码如下:
public interface Transaction {
/**
* Retrieve inner database connection
* @return DataBase connection
* @throws SQLException
*/
//获得数据库连接
Connection getConnection() throws SQLException;
/**
* Commit inner database connection.
* @throws SQLException
*/
//提交
void commit() throws SQLException;
/**
* Rollback inner database connection.
* @throws SQLException
*/
//回滚
void rollback() throws SQLException;
/**
* Close inner database connection.
* @throws SQLException
*/
//连接关闭
void close() throws SQLException;
/**
* Get transaction timeout if set
* @throws SQLException
*/
//获取事务timeout
Integer getTimeout() throws SQLException;
}
Transaction有两个实现类:JdbcTransaction和ManagedTransaction,分别对应两种事务管理方式。
JdbcTransaction的代码如下:
public class JdbcTransaction implements Transaction {
private static final Log log = LogFactory.getLog(JdbcTransaction.class);
//数据连接
protected Connection connection;
//数据源
protected DataSource dataSource;
//事务等级
protected TransactionIsolationLevel level;
//事务提交
protected boolean autoCommmit;
public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
dataSource = ds;
level = desiredLevel;
autoCommmit = desiredAutoCommit;
}
public JdbcTransaction(Connection connection) {
this.connection = connection;
}
@Override
public Connection getConnection() throws SQLException {
if (connection == null) {
openConnection();
}
return connection;
}
@Override
public void commit() throws SQLException {
if (connection != null && !connection.getAutoCommit()) {
if (log.isDebugEnabled()) {
log.debug("Committing JDBC Connection [" + connection + "]");
}
connection.commit();
}
}
@Override
public void rollback() throws SQLException {
if (connection != null && !connection.getAutoCommit()) {
if (log.isDebugEnabled()) {
log.debug("Rolling back JDBC Connection [" + connection