如何用java開啟mysql事務,要求詳細
創新互聯專注于西城網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供西城營銷型網站建設,西城網站制作、西城網頁設計、西城網站官網定制、微信小程序定制開發服務,打造西城網絡公司原創品牌,更為您提供西城網站排名全網營銷落地服務。
看你是什么事務,jdbc事務,還是分布式事務,還是容器事務
1,編程式事務管理(jdbc的事務是綁定在connection上的)
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");
conn.setAutoCommit(false); //取消自動提交
PreparedStatement ps = conn.prepareCall("update something");
ResultSet rs = ps.executeQuery();
conn.commit(); //手動提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務
先在工程的application.xml配置文件中添加如下代碼,開啟事務
!-- 聲明式事務控制配置 --
tx:annotation-driven transaction-manager="txManager"/
bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
property name="datasource" ref="bassDataSource"/property
/bean
然后在你需要開啟事務的接口前面添加注解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println("可以再類里和方法里面添加事務注解0~0");
throw new IOException();
}
直接調用接口方法就好
分布式事務處理(mysql貌似在5.X之后才支持) 的話,
1.可以直接使用spring+atomikos框架進行管理
參考:
就不貼測試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進行分布式事務管理(測試代碼如下)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//分布式事務處理
public class transferAccount
{
@SuppressWarnings("null")
public void testTransferAccount()
{
UserTransaction userts = null;
Connection connA = null;
PreparedStatement psA = null;
InitialContext context = null;
Connection connB = null;
PreparedStatement psB = null;
try
{
//獲得事務管理對象
userts = (UserTransaction) context.lookup("java:comp/UserTransaction");
//獲取兩個數據庫
connA = getDataSourceA().getConnection();
connB = getDataSourceB().getConnection();
//開啟事務
userts.begin();
//sql語句
psA = connA.prepareStatement("我加1");
psB = connB.prepareStatement("我減1");
//執行sql
psA.executeUpdate();
psB.executeUpdate();
//事務提交
userts.commit();
} catch (Exception e)
{
try
{
userts.rollback();
} catch (IllegalStateException | SecurityException
| SystemException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}
finally
{
try
{
psA.close();
psB.close();
connA.close();
connB.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public DataSource getDataSourceA()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1433);
dataSource.setUser("test");
dataSource.setPassword("test");
return dataSource;
}
public DataSource getDataSourceB()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1435);
dataSource.setUser("test1");
dataSource.setPassword("test1");
return dataSource;
}
}
你用同一個connection調用,
調用后再調用connection的comit()方法!
你spring事務理解不到位,再去看下相關資料吧。
你上邊所說的inerst update 只要將dao放到一個service下去管理就行 。
spring在service中事務管理,是當他調用service中的一個方法的時候 就會開啟一個事務,
直到你執行完這個方法,才會commit。所以只要其中有一個失敗都會回滾
如果你用Spring框架,Spring中可以實現事務管理,在spring 配置文件中配置事務管理器,也可以使用Spring注解式事務,在方法上加上@Transactional注解。
@Transactional
public void save() {
//你的代碼邏輯
}
如果沒有使用Spring框架,可以用JDBC處理事務,如下:
try{
con.setAutoCommit(false);//開啟事務 ......
con.commit();//try的最后提交事務
} catch() {
con.rollback();//回滾事務
}
網頁題目:java給代碼加上事務,java代碼中如何控制事務
文章網址:http://vcdvsql.cn/article12/hsdcdc.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、關鍵詞優化、靜態網站、品牌網站設計、網站內鏈、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯