
if (!$con){
exit("连接错误")
}
mysqli_set_charset($con,'utf8')
mysqli_query($con,"BEGIN")//开启事务
$sql = "sql语句1"
$sql2 = "sql语句2"
$res = mysqli_query($con,$sql)
$res1 = mysqli_query($con,$sql2)
if($res && $res1){
mysqli_query($con,"COMMIT")//提交事务
echo '提交成功。'
}else{
mysqli_query($con,"ROLLBACK")//事务回滚
echo '数据回滚。'
}
mysqli_query($con,"END")
触发器是在sql服务器中自动处理 比如删除一个用户,则该用户的所有消费记录都删除
则只用做一个delete触发器 当删除这个用户时 自动就删除了他的消费记录
执行sql事务的示例代码:
//执行事务处理
public void DoTran()
{ //建立连接并打开
SqlConnection myConn=GetConn()
myConn.Open()
SqlCommand myComm=new SqlCommand()
//SqlTransaction myTran=new SqlTransaction()
//注意,SqlTransaction类无公开的构造函数
SqlTransaction myTran
//创建一个事务
myTran=myConn.BeginTransaction()
try
{
//从此开始,基于该连接的数据 *** 作都被认为是事务的一部分
//下面绑定连接和事务对象
myComm.Connection=myConn
myComm.Transaction=myTran//定位到pubs数据库
myComm.CommandText="USE pubs"
myComm.ExecuteNonQuery()//更新数据
//将所有的计算机类图书
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'"
myComm.ExecuteNonQuery()
//提交事务
myTran.Commit()
}
catch(Exception err)
{
throw new ApplicationException("事务 *** 作出错,系统信息:"+err.Message)
}
finally
{
myConn.Close()
}
}
看你是什么事务,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
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)