1. 資料庫中的事務,java中用哪些方法保證事務
首先,資料庫本身支持事務;
事務開始,connection.setAutoCommit(false);
然後如平常使用資料庫一樣進行操作,如果任何一步捕獲到異常需要
connection.rollback 使之前的操作全部回滾;
最後需要 connection.commit();
connection.setAutoCommit(true);
hibernate的transacion類是把上述步驟給封裝了,原理一樣.
2. Java中,在JAVA中處理資料庫事務的方法
在java中 一般有兩種方式可以進行資料庫事務處理:
一是:如果你用到開源框架hibernater的話,在hibernater裡面它提供了事務工廠,你可以利用這個類來進行事務操作。
二是:我們一般有Connection連接對象來對事務進行操作。
3. 如何用java開啟mysql事務,要求詳細
如何用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框架進行管理
參考:http://blog.chinaunix.net/uid-21162795-id-3424973.html
就不貼測試代碼了,自己看著配置吧
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;
}
}
4. java 事務
Java中的事務處理
一般情況下,J2EE應用伺服器支持JDBC事務、JTA(Java Transaction API)事務、容器管理事務。一般情況下,最好不要在程序中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在盡可能短的時間內完成,不要在不同方法中實現事務的使用。下面我們列舉兩種事務處理方式。
1、JavaBean中使用JDBC方式進行事務處理
在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,打開一個連接對象Connection時,預設是auto-commit模式,每個SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。為了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之後,如果不調用commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法調用之後的所有SQL會在方法commit()調用時得到確認。
public int delete(int sID) {
dbc = new DataBaseConnection();
Connection con = dbc.getConnection();
try {
con.setAutoCommit(false);// 更改JDBC事務的默認提交方式
dbc.executeUpdate("delete from bylaw where ID=" + sID);
dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
con.commit();//提交JDBC事務
con.setAutoCommit(true);// 恢復JDBC事務的默認提交方式
dbc.close();
return 1;
}
catch (Exception exc) {
con.rollBack();//回滾JDBC事務
exc.printStackTrace();
dbc.close();
return -1;
}
}
2、SessionBean中的JTA事務
JTA 是事務服務的 J2EE 解決方案。本質上,它是描述事務介面(比如 UserTransaction 介面,開發人員直接使用該介面或者通過 J2EE 容器使用該介面來確保業務邏輯能夠可靠地運行)的 J2EE 模型的一部分。JTA 具有的三個主要的介面分別是 UserTransaction 介面、TransactionManager 介面和 Transaction 介面。這些介面共享公共的事務操作,例如 commit() 和 rollback(), 但是也包含特殊的事務操作,例如 suspend(),resume() 和 enlist(),它們只出現在特定的介面上,以便在實現中允許一定程度的訪問控制。例如,UserTransaction 能夠執行事務劃分和基本的事務操作,而 TransactionManager 能夠執行上下文管理。
應用程序可以調用UserTransaction.begin()方法開始一個事務,該事務與應用程序正在其中運行的當前線程相關聯。底層的事務管理器實際處理線程與事務之間的關聯。UserTransaction.commit()方法終止與當前線程關聯的事務。UserTransaction.rollback()方法將放棄與當前線程關聯的當前事務。
public int delete(int sID) {
DataBaseConnection dbc = null;
dbc = new DataBaseConnection();
dbc.getConnection();
UserTransaction transaction = sessionContext.getUserTransaction();//獲得JTA事務
try {
transaction.begin(); //開始JTA事務
dbc.executeUpdate("delete from bylaw where ID=" + sID);
dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
transaction.commit(); //提交JTA事務
dbc.close();
return 1;
}
catch (Exception exc) {
try {
transaction.rollback();//JTA事務回滾
}
catch (Exception ex) {
//JTA事務回滾出錯處理
ex.printStackTrace();
}
exc.printStackTrace();
dbc.close();
return -1;
}
}