看你是什么事務(wù),jdbc事務(wù),還是分布式事務(wù),還是容器事務(wù)
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括古縣網(wǎng)站建設(shè)、古縣網(wǎng)站制作、古縣網(wǎng)頁(yè)制作以及古縣網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,古縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到古縣省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1,編程式事務(wù)管理(jdbc的事務(wù)是綁定在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); //取消自動(dòng)提交
PreparedStatement ps = conn.prepareCall("update something");
ResultSet rs = ps.executeQuery();
conn.commit(); //手動(dòng)提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務(wù)
先在工程的application.xml配置文件中添加如下代碼,開(kāi)啟事務(wù)
!-- 聲明式事務(wù)控制配置 --
tx:annotation-driven transaction-manager="txManager"/
bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
property name="datasource" ref="bassDataSource"/property
/bean
然后在你需要開(kāi)啟事務(wù)的接口前面添加注解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println("可以再類里和方法里面添加事務(wù)注解0~0");
throw new IOException();
}
直接調(diào)用接口方法就好
分布式事務(wù)處理(mysql貌似在5.X之后才支持) 的話,
1.可以直接使用spring+atomikos框架進(jìn)行管理
參考:
就不貼測(cè)試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進(jìn)行分布式事務(wù)管理(測(cè)試代碼如下)
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;
//分布式事務(wù)處理
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
{
//獲得事務(wù)管理對(duì)象
userts = (UserTransaction) context.lookup("java:comp/UserTransaction");
//獲取兩個(gè)數(shù)據(jù)庫(kù)
connA = getDataSourceA().getConnection();
connB = getDataSourceB().getConnection();
//開(kāi)啟事務(wù)
userts.begin();
//sql語(yǔ)句
psA = connA.prepareStatement("我加1");
psB = connB.prepareStatement("我減1");
//執(zhí)行sql
psA.executeUpdate();
psB.executeUpdate();
//事務(wù)提交
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;
}
}
CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int)
BEGIN
#Routine body goes here...
DECLARE flag int DEFAULT parameter1;#聲明變量flag,將參數(shù)值賦給該變量
DECLARE uuidStr VARCHAR(32);#聲明一個(gè)長(zhǎng)度為32位的字符串
DECLARE currentTime TIMESTAMP;#聲明一個(gè)類型為時(shí)間戳的變量
declare err INT default 0;#聲明一個(gè)整形變量err,默認(rèn)值是0
declare continue handler for sqlexception set err=1;#當(dāng)sqlexception handler捕捉到異常時(shí),設(shè)置err=1
START TRANSACTION;#開(kāi)始事務(wù)
WHILE flag0 DO #注意: while不能空實(shí)現(xiàn)(在while塊中,里面必須有語(yǔ)句)
#uuid()函數(shù)得到的字符串是'6ccd780c-baba-1026-9564-0040f4311e29',剔除里面的-,得到一個(gè)32位的字符串
SET uuidStr = REPLACE(UUID(),'-','') ;
#得到當(dāng)前的時(shí)間
SET currentTime = CURRENT_TIMESTAMP();
#執(zhí)行插入語(yǔ)句,注意連接字符串的函數(shù)concat(str1,str2,...);其中str..也可以是數(shù)字類型
INSERT INTO
表名稱
(id,title,keyword,hasImage,isTodayHead,isShowInHome,isBigness,publishTime,originId,modify_time,isAnalysis)
VALUE
(uuidStr,CONCAT('事件標(biāo)題',flag),CONCAT('關(guān)鍵字',flag),1,1,0,0,currentTime,CONCAT('xxxxxxx',flag),currentTime,1);
#每循環(huán)一次,flag要減去1,注意沒(méi)有flag--的語(yǔ)法
set flag = flag-1;
#在這里測(cè)試當(dāng)err=1時(shí),事務(wù)是否有了回滾,測(cè)試ok
#IF flag=7 THEN #注意在procedure中給變量賦值要用到set,或在變量聲明時(shí)用default來(lái)父子,所以=號(hào)可以用來(lái)比較兩邊的值是否相等,=也可,區(qū)別先不去糾結(jié)。
#set err=1;
#END if;
END WHILE;
IF (err=0) THEN
commit;
select 'OK';
ELSE
rollback;
select 'err';
END IF;
END;
1、啟動(dòng)Navicat for MySQL,新建數(shù)據(jù)庫(kù)連接,打開(kāi)數(shù)據(jù)庫(kù),可能有點(diǎn)啰嗦。
2、可以先查看定時(shí)任務(wù)的是否開(kāi)啟。通過(guò)以下命令:show variables like '%sche%';
3、如果其設(shè)置值為為 OFF 或 0 ,通過(guò)執(zhí)行下列語(yǔ)句,來(lái)開(kāi)啟event_scheduler,set global event_scheduler =1,把設(shè)置為設(shè)為ON 或 1。
4、新建一個(gè)函數(shù) ,取名為update_qiandao ,內(nèi)容為 UPDATE week7_user SET isqiandao = 0
5、參照上圖,新建一個(gè)事件 ,在定義里寫(xiě) call update_qiandao() --也就是之前定義的函數(shù)
在“計(jì)劃”選項(xiàng)卡中設(shè)置 執(zhí)行時(shí)間,這里我選擇的是每天。
名稱欄目:怎么給mysql添加事務(wù) mysql事務(wù)注意什么
鏈接分享:http://m.rwnh.cn/article32/dooppsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站、服務(wù)器托管、微信公眾號(hào)、移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容