Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
CF and Stored Procedures
Lei Wang
ALP International
Main Topics
Database Locks
How Cold Fusion perform DB locks
Stored Procedure
Stress test to compare Cftransaction
and stored procedure
How to use stored procedure
Common Mistakes
Database Locks
“Lost update problem”
Multiple users accessing the same data
User1
User2
Read from database
Update record
Update record
Database Locks
Blocking access for all other users
User1
User2
Begin Transaction
Read Value
Lock
Waiting
Update Value
Commit Transaction
Begin Transaction
Lock
Read Value
Update Value
Commit Transaction
Types of Locks
Table-level: supported by all database.
The entire table is locked when a user
is posting a transaction that utilizes a
row from that table
Row-level: supported by higher-end
database. Only records being utilized by
a transaction are locked.
How Cold Fusion perform DB
Locks
Use CFTRANSACTION to group
multiple queries into a single unit.
CFTRANSACTION also provides
commit and rollback processing.
<CFTRANSACTION>
ACTION="BEGIN" or "COMMIT" or "ROLLBACK"
ISOLATION="Read_Uncommitted" or "Read_Committed" or
"Repeatable_Read"
</CFTRANSACTION>
CFLOCK
Standard usage of
cftransaction(from CF Studio)
<CFTRY>
<CFSET commitIt = "Yes">
<CFTRANSACTION ACTION="BEGIN">
<CFQUERY NAME='makeNewCourse' DATASOURCE='cfsnippets'>
INSERT INTO Courses (Number, Descript) VALUES ('#myNumber#', '#myDescription#')
</CFQUERY>
<CFCATCH TYPE="DATABASE">
<CFTRANSACTION ACTION="ROLLBACK"/>
<CFSET commitIt = "No">
</CFCATCH>
<CFIF commitIt>
<CFTRANSACTION ACTION="COMMIT"/>
<CFQUERY >
………………………………………
</CFQUERY>
</CFTRANSACTION>
</CFTRY>
Ending tag within the cftry block should be a cfcatch tag
Standard usage of
cftransaction
<CFTRANSACTION ACTION=“BEGIN”>
<CFTRY>
<CFQUERY NAME='makeNewCourse' DATASOURCE='cfsnippets'>
INSERT INTO Courses (Number, Descript) VALUES ('#myNumber#', '#myDescription#')
</CFQUERY>
<CFQUERY >
………………………………………
</CFQUERY>
<CFTRANSACTION ACTION="COMMIT"/>
<CFCATCH TYPE="DATABASE">
<CFTRANSACTION ACTION="ROLLBACK"/>
</CFCATCH>
</CFTRY>
</CFTRANSACTION>
How DB tools perform Lock
Transaction
A logical unit of work.
Begin the transaction
Commit the transaction or rollback
transaction
Standard usage of transaction
BEGIN TRANSACTION MyTransaction
SELECT * FROM roysched
WHERE title_id LIKE ‘Pc%’
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
COMMIT TRANSACTION MyTransaction
Stored Procedure
A stored procedure is basically a
precompiled program that is stored at
the server site.
Stored procedure is not written in SQL
PL/SQL
Oracle
Transact-SQL
Sybase & SQL Server
Advantage of Stored
Procedure
It enables you to write and maintain a
single set of code that is utilized by all
current and future applications that
utilize the database
It insulates the application developers
from the structure of the database
It can provide better performance.
Stress test
LoadRunner is used to conduct 3 levels of
stress test, 10, 50, 100 users.
Internal network 100 M bps
Cold Fusion server 5 on Windows 2000
server (1.5 Ghz CPU, 512 MB memory)
SQL server 7 on the same Windows 2000
server
5 Pentium 430 Mhz Dell machines as client
Stress test results
Users cftransaction Stored Procedure
1
10
50
100
0.11
1.96
8.15
15
0.11
1.47
4.57
9
What determines which tool to
use
Less traffic, simple web page
CFTRSACTION
Heavy traffic, complicated web pages
Stored procedure
How to write stored procedure
CREATE PROCEDURE Insert_invoice
@Amount smallmoney,@DiscAmt smallmoney,@DiscCode char(3),@PaymentTypeCode char(2),
@Token varchar(30),
@NextbContactID int ,@NextInvoiceID int output
AS
BEGIN TRANSACTION
select
Insert
values(
@NextInvoiceID=ISNULL(max(InvoiceID)+1,10000) from T_Invoice
into T_Invoice
@NextInvoiceID,getdate(),@Amount,@DiscAmt,@DiscCode,@PaymentTypeCode,
null,getdate(),@NextbContactID,null,@Token,'N',null,null)
IF @@ERROR <>0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
How to use stored procedure
Cfstoredproc tag
<CFSTOREDPROC
PROCEDURE="procedure name"
DATASOURCE="ds_name"
USERNAME="username"
PASSWORD="password"
DBSERVER="dbms"
DBNAME="database name"
BLOCKFACTOR="blocksize"
PROVIDER="COMProvider"
PROVIDERDSN="datasource"
DEBUG="Yes/No"
RETURNCODE="Yes/No">
How to user Stored Procedure
Cfprocparam tag
<CFPROCPARAM
TYPE="IN/OUT/INOUT"
VARIABLE="variable name"
DBVARNAME="DB variable name"
VALUE="parameter value“
CFSQLTYPE="parameter datatype“
MAXLENGTH="length"
SCALE="decimal places"
NULL="yes/no">
CFPROCPARAM
Type:
IN/OUT/INOUT
CFSQLTYPE 17 total
CF_SQL_INTEGER
CF_SQL_CHAR
CF_SQL_VARCHAR
CF_SQL_DATE
CF_SQL_MONEY
CFPROCPARAM
DBVARNAME
Start with @
@NextInvoiceID
VARIABLE
CF variable name
How to use Stored Procedure
<cfstoredproc datasource="#request.DSN#"
procedure="Insert_Invoice">
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY"
value="#attributes.Total_Due#" dbvarname="@Amount">
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY" value="#attributes.DiscAmt#"
dbvarname="@DiscAmt">
<cfprocparam type="in"
cfsqltype="CF_SQL_CHAR"
value="#attributes.assumedDiscount#" dbvarname="@DiscCode">
<cfprocparam type="in"
cfsqltype="CF_SQL_CHAR"
value="#attributes.PaymentType#" dbvarname="@PaymentTypeCode">
<cfprocparam type="in"
cfsqltype="CF_SQL_VARCHAR"
value="#str_customerToken#" dbvarname="@Token">
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER" value="1"
dbvarname="@NextContactID">
<cfprocparam type="out" cfsqltype="CF_SQL_INTEGER" variable="NextInvoiceID"
dbvarname="@NextInvoiceID">
</cfstoredproc>
Common mistakes when
using Stored Procedure
Declaration order in stored procedure is
different from CFPROCPARAM order
Error message
Operand type clash: int is incompatible
with text
Variables are not in the same
order
@Amount smallmoney,
@DiscAmt smallmoney,
@DiscCode char(3),
@PaymentTypeCode char(2),
@Token varchar(30),
@NextContactID int,
@NextInvoiceID int output
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY"
value="#attributes.Total_Due#"
dbvarname="@Amount">
<cfprocparam ***
dbvarname="@DiscAmt">
<cfprocparam ***
dbvarname="@DiscCode">
<cfprocparam ***
dbvarname="@PaymentTypeCod
e">
<cfprocparam *** dbvarname="@Token">
<cfprocparam ***
dbvarname="@NextContactID">
<cfprocparam ***
dbvarname="@NextInvoiceID">
Common Mistakes
Every In variable need a value
create procedure Update_Email
@StudentID int, @InvoiceID int, @Email varchar(60)
as
Begin
SELECT
FROM
WHERE
@InvoiceID=InvoiceID,@Email=StudentEmail
T_Student
StudentID=@StudentID
UPDATE
T_Invoice
SET
WHERE
END
Email=@Email
InvoiceID=@InvoiceID
Every Variable need a value
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER"
value="#attributes.StudentID#" dbvarname="@StudentID">
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER"
value="#attributes.InvoiceID#" dbvarname="@InvoiceID">
<cfprocparam type="in" cfsqltype="CF_SQL_VARCHAR"
value=“[email protected]” dbvarname="@Email">
Conflict with other DB tools
CFTRANSACTION and TRIGGER
Triggers are specialized stored
procedures that are executed
automatically when a particular event
occurs and are used to enforce data
integrity
A lot of triggers have Rollback
transaction command
Trigger
CREATE TRIGGER Insert_T_Contacts
ON T_Contacts
FOR INSERT AS
DECLARE @JustInsertedpEmail varchar(60),
@ContactIDNew int,
@ContactIDOld int,
BEGIN
SELECT
@JustInsertedpEmail=PrimaryEmailAddress,
@ContactIDNew=ContactID
FROM
INSERTED
SELECT
@ContactIDOld=ContactID,
FROM
T_Contacts
WHERE
PrimaryEmailAddress=@JustInsertedpEmail
AND
ContactID!=@ContactIDNew
IF @@ROWCOUNT > 0
ROLLBACK TRANSACTION
End
Q&A
[email protected]