php 怎么使用Mysql事务实例代码

php 怎么使用Mysql事务实例代码,第1张

$con=mysqli_connect('localhost','root','123456','test')

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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/8665363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-19
下一篇2023-04-19

发表评论

登录后才能评论

评论列表(0条)

    保存