mybatis 使用事務處理


mybatis默認開啟事務

  以前使用JDBC的時候,如果要開啟事務,我們需要調用conn.setAutoCommit(false)方法來關閉自動提交,之后才能進行事務操作,否則每一次對數據庫的操作都會持久化到磁盤中。

  而mybatis呢,如果底層使用JDBC(在mybatis.xml中配置的transactionManager標簽的type設為jdbc的話),那么,mybatis會默認開啟事務,也就是說,mybatis默認是關閉自動提交的。

  在mybatis中,如果我們執行了數據庫的修改操作(insert、update、delete),必須調用session.commit()方法,所做的修改才能持久化到磁盤。

 

怎么讓mybatis開啟自動提交(關閉事務)

  在openSession()時,傳入true,即可關閉事務。

 

 

舉個例子

  有PeopleMapp.xml,配置有一個insert命令:

<insert id="insertPeople" parameterType="People">
	insert into people values (null, #{name}, #{age})
</insert>

  測試代碼如下:

package lixin.gan.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import lixin.gan.pojo.People;

public class TestTransaction {
	public static void main(String[] args){
		InputStream config = null;
		
		try {
			config = Resources.getResourceAsStream("mybatis.xml");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
		
		SqlSession session = factory.openSession();
		
		People p = new People();
		p.setName("王五3");
		p.setAge(88);
		
		try {
			int affected_rows =session.insert("lixin.gan.mapper.PeopleMapper.insertPeople", p);
			if (affected_rows <= 0) {
				throw new Exception("第1個操作失敗");
			} else {
				System.out.println("第1個操作成功");
			}
		} catch (Exception e) {
			// 捕獲到異常,將操作回滾
			//e.printStackTrace();
			session.rollback();
		}
		

		p.setName("王五222222222222222222222222222");
		p.setAge(77);
		try {
			int affected_rows =session.insert("lixin.gan.mapper.PeopleMapper.insertPeople", p);
			if (affected_rows <= 0) {
				throw new Exception("第2個操作失敗");
			} else {
				System.out.println("第2個操作成功");
			}
		} catch (Exception e) {
			session.rollback();
		}
		
		session.commit();
		session.close();
		System.out.println("over");
		
	}
}

  第二次調用對象的setName設置的name屬性值,超過了people表中的name字段長度,所以插入操作會失敗,於是會拋出異常,一場被捕獲后,當前的session就會本次session存在期間的所有操作。

  

 

注意事項

  1、要想使用事務,請將數據庫表的引擎設置為InnoDb,別用MyISAM。

  2、如果是DML,請一定要記得commit(),否則操作不會生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM