/** * 数据库连接
* $conn = mysql_connect('localhost', 'root', ''); * mysql_select_db('test', $conn); *mysql_query("SET NAMES GBK"); *支持事务的表必须是InnoDB类型 *一段事务中只能出现一次: *mysql_query('START TRANSACTION');//开始事务 *mysql_query(' ROLLBACK ');//回滚事务 *mysql_query('COMMIT');//提交事务 * 上面的是最原始的写法
*事务锁:如果连个同步或异步同时更新同样的数据,那么我们就要用到事务锁住正在执行的sql语句,直到事务提交,下一条数据才能执行 *如果一段事务中出现多次回滚事务,则在,提交事务时只将第一次回滚前至开始事务后对数据库的所有操作取消,第一次回滚后至提交事务前所有对数据库操作仍将有效,所以一般将回滚语句仅放在提交事务语句前 *如果一段事务无提交语句,则从开始事务时以下的所有对数据库操作虽执行(执行方法返回对错),但对数据库无影响,但是在执行下段开始务语句时,前段事务自动提交 * 以下示例是我结合现有框架写的测试文件 * 提示:锁住的数据查询条件已经是唯一标识 */ class test extends controller { private $db; function __construct($options) { parent::__construct($options, []); $this->db = new MySql(); } function run(){ try { $this->db->beginTRAN(); $state = $this->db->getField("SELECT state FROM test WHERE id = 1 FOR UPDATE"); if($state == 2){ throw new Exception('已完成!'); } $data= array( 'state' =>2 ); $res = $this->db->update('test',$data,"id=1"); if(!$res){ throw new Exception('更新成功!'); } $this->db->commitTRAN(); dump('成功');die; } catch ( Exception $e ) { $this->db->rollBackTRAN(); dump($e->getMessage());die; } } }