使用JDBC的事务管理
使⽤ java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())
使用MANAGED的事务管理
MyBatis⾃身不会去实现事务管理,⽽让程序的容器如(Spring, JBOSS)来实现对事务的管理
<environment id="development">
<!-- mybatis使⽤jdbc事务管理⽅式 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="test.net"/>
</dataSource>
</environment>
- 事务⼯⼚TransactionFactory 的两个实现类 JdbcTransactionFactory->JdbcTransaction ManagedTransactionFactory->ManagedTransaction
Mysql的Innodb和MyISAM引擎的区别
区别项 | Innodb | myisam |
---|---|---|
事务 | ⽀持 | 不⽀持 |
锁粒度 | ⾏锁,适合⾼并发 | 表锁,不适合⾼并发 |
是否默认 | 默认 | ⾮默认 |
⽀持外键 | ⽀持外键 | 不⽀持 |
适合场景 | 读写均衡,写⼤于读场景,需要事务 | 读多写少场景,不需要事务 |
全⽂索引 | 可以通过插件实现, 更多使⽤ElasticSearch | ⽀持全⽂索引 |
mybatis事务控制
当表是myisam引擎的时候,没有事务,可以直接插入成功
事务管理记得改为这个mybatis-config.xml
<transactionManager type="JDBC"/>
public class transactionTest {
public static void main(String[] args) throws IOException {
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("config/mybatis-config.xml"));
SqlSession sqlSession = build.openSession(true);
try {
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
Video video = new Video();
video.setTitle("测试事务");
videoMapper.addVideo(video);
int i = 1/0;
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
sqlSession.close();
}
}
当出现异常的时候,sqlSession会自动回滚处理
事务管理形式 MANAGED,设置⾮⾃动提交,然后注释 commit, 依旧可以保存成功 不⽤重点关注,公司开发项⽬的事务控制基本是交给Spring,或者使⽤分布式事务